This article is in need of an editorial review.
This translation is incomplete. Please help translate this article from English.
この章では、キーによって順序付けされるデータコレクションを紹介します。; MapオブジェクトとSetオブジェクトは挿入順に反復可能な要素を含みます。
Maps
Mapオブジェクト
ECMAScript第6版では値に値をマッピングするための新しいデータ構造が導入されました。Mapオブジェクトは単純なキー/バリュー マップで挿入順に要素を反復します。
次のコードではMapを用いたいくつかの基本的な操作を示します。 また、追加の例や詳細なAPIについては、Mapリファレンスページをご覧ください。for...of ループを使用して、各反復に対して[key, value]の配列を返すことができます。
var sayings = new Map();
sayings.set("dog", "woof");
sayings.set("cat", "meow");
sayings.set("elephant", "toot");
sayings.size; // 3
sayings.get("fox"); // undefined
sayings.has("bird"); // false
sayings.delete("dog");
for (var [key, value] of sayings) {
console.log(key + " goes " + value);
}
// "cat goes meow"
// "elephant goes toot"
Objectと Mapの比較
伝統的に、objectsは文字列を値にマップするために使用されていました。オブジェクトによってキーを値に設定して、これらの値を取得して、キーを削除して、何かがキーに格納されているかどうかを検出できます。しかしながら、Mapオブジェクトはより良くマッピングするいくつかのより多くの利点を持っています。
ObjectのキーはStringsです。それらはMapに対して任意の値とすることができます。Objectに対して手動でサイズを追跡する必要があるので、簡単にMapのサイズを取得することができます。- マップの反復は要素の挿入順です。
Objectはプロトタイプを持ちます。だから、マップにはデフォルトキーがあります。(これはmap = Object.create(null)を使用してバイパスされます)。
下記の二つのヒントは、MapかObjectのどちらを使用するか決めるのに役立ちます。:
- 実行時までキーが不明なとき、そして、すべてのキーが同じ型で、すべての値が同じ型のときオブジェクトを通してマップを使用してください。
- 個々の要素上で動作するロジックがある場合にオブジェクトを使用してください。
WeakMap オブジェクト
WeakMapオブジェクトは、キーがオブジェクトのみでありその値は任意の値であるキー/バリュー ペアのコレクションです。キーでのオブジェクト参照は弱く保持され、もはや他のオブジェクトへの参照が存在しない場合、ガーベジコレクション(GC)の対象であることを意味します。WeakMap APIはMap APIと同じです。
Mapオブジェクトとの違いは、WeakMap キーが列挙可能ではないことです(すなわち、キーのリストを取得するメソッドがありません)。 その場合、このリストには、非決定論を導入し、ガベージコレクションの状態に依存するであろう。
詳細やサンプルコードについては、WeakMapリファレンスページの"Why WeakMap?"もご覧ください。
WeakMapオブジェクトのユースケースは、オブジェクトに対してプライベートデータを格納すること、または、実装の詳細を隠すことです。次の例はNick Fitzgerald ブログの投稿 "Hiding Implementation Details with ECMAScript 6 WeakMaps"からです。プライベートデータとプライベートメソッドはオブジェクトの内部に属していて、privatesWeakMapオブジェクト内に格納されています。インスタンスとプロトタイプ上に露出しているすべてのものはパブリックです。すなわち、 privatesはモジュールから露出していないので、他のすべてのものは外側の世界からアクセスできません。
const privates = new WeakMap();
function Public() {
const me = {
// Private data goes here
};
privates.set(this, me);
}
Public.prototype.method = function () {
const me = privates.get(this);
// Do stuff with private data in `me`...
};
module.exports = Public;
Sets
Set オブジェクト
Set オブジェクトは値のコレクションです。挿入順に要素を反復することができます。 Set内の値は一度しか発生しません。;Setのコレクション内で一意です。
次のコードでは、Setを用いたいつくかの基本的な操作を示します。また、追加の例や詳細なAPIについては、Setリファレンスページもご覧ください。
var mySet = new Set();
mySet.add(1);
mySet.add("some text");
mySet.add("foo");
mySet.has(1); // true
mySet.delete("foo");
mySet.size; // 2
for (let item of mySet) console.log(item);
// 1
// "some text"
ArrayとSet間の変換
Array.fromまたはspread operatorを使用して、SetからArrayを生成できます。また、他の方向に変換するためにSetコンストラクタはArrayを受け入れます。Setオブジェクトは一意の値を格納することに再度注意してください。だから、Arrayから重複した要素は変換するときに削除されます。
Array.from(mySet); [...mySet2]; mySet2 = new Set([1,2,3,4]);
Arrayと Setの比較
伝統的に、要素のsetはたくさんの状況のJavaScriptの配列に格納されました。 しかしながら、新しいSetオブジェクトはいくつかの利点を持ちます。:
- 配列に対して
indexOfを使用してコレクション内に要素が存在するか調べるのは低速です。 Setオブジェクトの値によって要素を削除できます。配列を用いて、要素のインデックスに基づいて繋ぐ必要があります。NaN値は配列内にindexOfで見つかりません。Setオブジェクトは一意の値を格納します。自分で重複を追跡する必要はありません。
WeakSet オブジェクト
WeakSet オブジェクトは、オブジェクトのコレクションです。WeakSet内のオブジェクトは一度しか発生しません。すなわち、WeakSetコレクション内では一意です。オブジェクトは列挙可能ではありません。
Setオブジェクトとの主な違いは下記の通りです。:
Setsとは対照的に、WeakSetsはオブジェクトのみのコレクションで、任意の型の任意の値のコレクションではありません。WeakSetは弱いです。: コレクション内のオブジェクトへの参照は弱く保持されています。WeakSet内に格納されているオブジェクトへの他の参照が存在しない場合、ガベージコレクションの対象になります。これは、またコレクション内に格納されている現在のオブジェクトのリストがないことを意味します。WeakSetsは列挙可能ではありません。
WeakSet オブジェクトのユースケースは限定されます。それらは、メモリリークが発生しません。だから、例えば、キーとしてDOM要素を使用して目的を追跡するためにそれらをマークすることは安全です。
MapとSetのキーと値の同等
Mapオブジェクトのキーの同等とSetオブジェクトの値の同等の両方とも、"same-value-zero algorithm"に基づいています。:
- 同等は識別情報の比較演算子
===のように動作します。 -0と+0は等しいと見なされます。NaNは(===に反して)自身に等しいと考えられています。