JavaScript---Map集合構造の詳細
4662 ワード
Mapオブジェクトはキーのペアを保存します.どの値(オブジェクトまたは元の値)もキーまたは値として使用できます.
シンタックスnew Map([iterable])パラメータiterable Iterableは、1つの配列または他のiterableオブジェクトとすることができ、その要素またはキーパッドペアまたは2つの要素の配列とすることができる.各キーのペアは新しいMapに追加されます.nullはundefinedとして扱われます.1つのMapオブジェクトが挿入順序でその要素のfor...ofループを反復するたびに、「key,value」配列を返します.
キーの等しい(Key equality)キーの比較は、「SameValueZero」アルゴリズムに基づいています.NaNはNaNと同じです.(NaN==NaNですが)残りの他の値は、==演算子の結果によって、等しくなるかどうかを判断します.現在のECMAScript規格では、-0と+0は同じとされていますが、初期の草案ではそうではありません.詳細については、ブラウザ互換性テーブルの「value equality for-0 and 0」を参照してください.
Objectsとmapsの比較ObjectとMapは似ています.ボタンを押して1つの値にアクセスし、削除キーを押して、1つのキーが値にバインディングされているかどうかを確認します.だから(他にも建てられた代替方法がないです.)昔はずっと対象をMapとして使っていました.でも、MapとObjectは重要な違いがあります.下記の状況でMapはより良い選択です.
オブジェクトのキーは文字列またはSymbolだけですが、一つのMapのキーは、関数、オブジェクト、基本タイプを含む任意の値であります.size属性で直接にMapのキーの対数を取得できますが、Objectのキーの対数は手動で計算できます.Mapは反復可能であり、Objectの反復はまずキー配列を取得してから反復する必要がある.Objectはすべて自分の原型があって、だから原型の鎖の上のキーの名前は対象の上のキーの名前と衝突するかもしれません.ES 5からはmap=Object.create(null)でプロトタイプのないオブジェクトを作成できますが、このような使い方はあまり見られません.Mapは頻繁にキーパッドの値を削除するシーンにおいて、性能の優位性があります.属性Map.length属性lengthの値は0です.get Map[@@species]本構成関数は、派生オブジェクトを作成するために使用されます.Map.prototypeはMapコンストラクタの原型を表します.属性の追加を許可して、すべてのMapオブジェクトに適用します.MapインスタンスのすべてのMapオブジェクトのインスタンスは、Map.prototypeを引き継ぎます.
プロパティMap.prototype.com nstructorは、インスタンスのプロトタイプを作成した関数を返します.デフォルトはMap関数です.Map.prototype.sizeは、Mapオブジェクトのキー/値ペアの数を返します.メソッドMap.prototype.clear()は、Mapオブジェクトのすべてのキー/値ペアを削除します.Map.prototype.delete(key)は、キーに関連する値を除去し、値を返します.これは以前にMap.prototype.has(key)によってtrueに返されます.その後Map.prototype.hasを呼び出したらfalseに戻ります.Map.prototype.entries()は、Mapオブジェクトの各要素の「key,value」配列を挿入順に含む新しいIteratorオブジェクトを返します.Map.prototype.forEach(calbackFn[,thisArg])は挿入順に、Mapオブジェクト内の各キーの値の対に一回のcalbackFn関数を呼び出します.forEachのためにthisArgが提供された場合、それは毎回のコールバックの中でthis値とします.Map.prototype.getはキーに対応する値を返し、存在しない場合はundefinedを返します.Map.prototype.has(key)は、Mapのインスタンスにキーの対応する値が含まれているかどうかを示すブール値を返します.Map.prototype.keys()は、Mapオブジェクトの各要素のキーを挿入順に含む新しいIteratorオブジェクトを返します.Map.prototype.setは、Mapオブジェクトの中のキーの値を設定します.このMapオブジェクトを返します.Map.prototype.values()は、Mapオブジェクトの各要素の値を挿入順に含めた新しいIteratorオブジェクトを返します.Map.prototype@iteratorは、Mapオブジェクトの各要素の[key,value]配列を挿入順に含む新しいIteratorオブジェクトを返します.例を使用して、マッピングオブジェクトを使用します.
シンタックスnew Map([iterable])パラメータiterable Iterableは、1つの配列または他のiterableオブジェクトとすることができ、その要素またはキーパッドペアまたは2つの要素の配列とすることができる.各キーのペアは新しいMapに追加されます.nullはundefinedとして扱われます.1つのMapオブジェクトが挿入順序でその要素のfor...ofループを反復するたびに、「key,value」配列を返します.
キーの等しい(Key equality)キーの比較は、「SameValueZero」アルゴリズムに基づいています.NaNはNaNと同じです.(NaN==NaNですが)残りの他の値は、==演算子の結果によって、等しくなるかどうかを判断します.現在のECMAScript規格では、-0と+0は同じとされていますが、初期の草案ではそうではありません.詳細については、ブラウザ互換性テーブルの「value equality for-0 and 0」を参照してください.
Objectsとmapsの比較ObjectとMapは似ています.ボタンを押して1つの値にアクセスし、削除キーを押して、1つのキーが値にバインディングされているかどうかを確認します.だから(他にも建てられた代替方法がないです.)昔はずっと対象をMapとして使っていました.でも、MapとObjectは重要な違いがあります.下記の状況でMapはより良い選択です.
オブジェクトのキーは文字列またはSymbolだけですが、一つのMapのキーは、関数、オブジェクト、基本タイプを含む任意の値であります.size属性で直接にMapのキーの対数を取得できますが、Objectのキーの対数は手動で計算できます.Mapは反復可能であり、Objectの反復はまずキー配列を取得してから反復する必要がある.Objectはすべて自分の原型があって、だから原型の鎖の上のキーの名前は対象の上のキーの名前と衝突するかもしれません.ES 5からはmap=Object.create(null)でプロトタイプのないオブジェクトを作成できますが、このような使い方はあまり見られません.Mapは頻繁にキーパッドの値を削除するシーンにおいて、性能の優位性があります.属性Map.length属性lengthの値は0です.get Map[@@species]本構成関数は、派生オブジェクトを作成するために使用されます.Map.prototypeはMapコンストラクタの原型を表します.属性の追加を許可して、すべてのMapオブジェクトに適用します.MapインスタンスのすべてのMapオブジェクトのインスタンスは、Map.prototypeを引き継ぎます.
プロパティMap.prototype.com nstructorは、インスタンスのプロトタイプを作成した関数を返します.デフォルトはMap関数です.Map.prototype.sizeは、Mapオブジェクトのキー/値ペアの数を返します.メソッドMap.prototype.clear()は、Mapオブジェクトのすべてのキー/値ペアを削除します.Map.prototype.delete(key)は、キーに関連する値を除去し、値を返します.これは以前にMap.prototype.has(key)によってtrueに返されます.その後Map.prototype.hasを呼び出したらfalseに戻ります.Map.prototype.entries()は、Mapオブジェクトの各要素の「key,value」配列を挿入順に含む新しいIteratorオブジェクトを返します.Map.prototype.forEach(calbackFn[,thisArg])は挿入順に、Mapオブジェクト内の各キーの値の対に一回のcalbackFn関数を呼び出します.forEachのためにthisArgが提供された場合、それは毎回のコールバックの中でthis値とします.Map.prototype.getはキーに対応する値を返し、存在しない場合はundefinedを返します.Map.prototype.has(key)は、Mapのインスタンスにキーの対応する値が含まれているかどうかを示すブール値を返します.Map.prototype.keys()は、Mapオブジェクトの各要素のキーを挿入順に含む新しいIteratorオブジェクトを返します.Map.prototype.setは、Mapオブジェクトの中のキーの値を設定します.このMapオブジェクトを返します.Map.prototype.values()は、Mapオブジェクトの各要素の値を挿入順に含めた新しいIteratorオブジェクトを返します.Map.prototype@iteratorは、Mapオブジェクトの各要素の[key,value]配列を挿入順に含む新しいIteratorオブジェクトを返します.例を使用して、マッピングオブジェクトを使用します.
var myMap = new Map();
var keyObj = {},
keyFunc = function () {},
keyString = "a string";
//
myMap.set(keyString, " 'a string' ");
myMap.set(keyObj, " keyObj ");
myMap.set(keyFunc, " keyFunc ");
myMap.size; // 3
//
myMap.get(keyString); // " 'a string' "
myMap.get(keyObj); // " keyObj "
myMap.get(keyFunc); // " keyFunc "
myMap.get("a string"); // " 'a string' "
// keyString === 'a string'
myMap.get({}); // undefined, keyObj !== {}
myMap.get(function() {}) // undefined, keyFunc !== function () {}
NaNをマッピングのキーNaNとしてもMapオブジェクトのキーとすることができます.NaNといかなる値も自分と同じではありませんが(NaN!==NaNはtrueに戻ります)、下記の例では、2つのNaNはMapのキーとして区別されていません.var myMap = new Map();
myMap.set(NaN, "not a number");
myMap.get(NaN); // "not a number"
var otherNaN = Number("foo");
myMap.get(otherNaN); // "not a number"
for...ofメソッドを使用して反復マッピングもfor...ofサイクルを使用して反復を実行できます.var myMap = new Map();// :866109386
myMap.set(0, "zero");// 1-3
myMap.set(1, "one");// ,
for (var [key, value] of myMap) {
console.log(key + " = " + value);
}
// log。 "0 = zero" "1 = one"
for (var key of myMap.keys()) {
console.log(key);
}
// log。 "0" "1"
for (var value of myMap.values()) {
console.log(value);
}
// log。 "zero" "one"
for (var [key, value] of myMap.entries()) {
console.log(key + " = " + value);
}
// log。 "0 = zero" "1 = one"
forEach()法を使って反復マッピングしても、forEach()法によって反復できます. myMap.forEach(function(value, key) {
console.log(key + " = " + value);
}, myMap)
// logs。 "0 = zero" "1 = one"
マッピングと配列オブジェクトの関係var kvArray = [["key1", "value1"], ["key2", "value2"]];
//
var myMap = new Map(kvArray);
myMap.get("key1"); // "value1"
//
console.log(uneval([...myMap])); // kvArray
// ,
console.log(uneval([...myMap.keys()])); // ["key1", "key2"]