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オブジェクトを返します.例を使用して、マッピングオブジェクトを使用します.
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"]