索引鍵集合

您可以使用物件常值來儲存鍵/值組合,並使用陣列儲存鍵/值組合 可疊代集合的值。ES6 還導入了特殊資料結構 適合更精細的用途:對應鍵/值組合、設定 個別值

Map 是一種可疊代的資料結構,可將資訊儲存為鍵/值組合 物件實字類似有別於物件實字,Map 允許同時使用兩個值。 和鍵都可以包含任何資料類型,而排序元素新增到「地圖」時, 以保留更動。

如要建立地圖,請使用 Map() 建構函式:

const myMap = new Map();

myMap;
> Map(0)

您可以使用與陣列 (或 任何疊代器物件),其中包含 這類物件是由兩個元素組成每個元素 雙元素資料結構會成為鍵,第二個則是值 與該金鑰建立關聯最簡單的形式,就是在 每個元素本身都是陣列,由兩個元素組成:鍵和 要新增至地圖的元素值:

const myMap = new Map([
    [ "myKey", "A string value" ],
    [ "mySecondKey", 500 ],
    [ "myThirdKey", true ]
]);

myMap;
> Map(3) {'myKey' => 'A string value', 'mySecondKey' => 500, 'myThirdKey' => true}

再次提醒,Map 物件與物件實字不同,兩者的值 而鍵可以接受任何資料類型和值:

const notAFunction = () => console.log( "function" );
const myMap = new Map([
  [ null, 0 ],
  [ false, "This is false" ],
  [ undefined, "No defined value" ],
  [ NaN, "Not a number" ]
]);

myMap;
> Map(4) {null => 0, false => 'This is false', undefined => 'No defined value', NaN => 'Not a number'}

如要取得、設定或刪除地圖元素,請使用沿用自 Map 的方法 建構函式:

const myMap = new Map();

myMap;
> Map(0)

myMap.set( "myKey", "My value." );

myMap.has( "myKey" );
> true

myMap.get( "myKey" );
"My value."

myMap.delete( "myKey" );

myMap;
> Map(0)

地圖中的鍵是獨一無二的,也就是說,設定同一個鍵會覆寫 先前儲存的鍵/值組合:

const myMap = new Map([ [ "myKey", "A string value" ] ]);

myMap.set( "myKey", 500 );

myMap;
> Map(1) {'myKey' => 500}

與物件一樣,您可以將 Map 指派給使用 const 宣告的變數, 然後修改該「地圖」但與其他 const 用途一樣,您無法 修改或刪除變數本身:

const myMap = new Map();
myMap.set( "myKey", "A string value" );

myMap;
> Map(1) {'myKey' => 500}

WeakMap

WeakMap 是具有「弱」狀態的地圖參考資料、 且必須為物件或 符號 (Symbols) 的參照 尚未新增至全域符號註冊資料庫

如要建立 WeakMap,請使用 WeakMap() 建構函式:

const myWeakMap = new WeakMap();

myWeakMap;
> WeakMap(0)

WeakMap 語法和 Map 相似,但 WeakMaps 沒有 iterable 屬性 以物件或符號為索引鍵以外的任何值都會造成語法錯誤。否 具有索引鍵的參照 WeakMap 之外、該物件或符號,以及 WeakMap 都可用來進行垃圾收集

這樣一來,您就能將物件的相關中繼資料儲存在 WeakMap (使用物件的參照做為鍵)。如果沒有其他參考資料 系統會將物件從記憶體中移除,並將該物件從記憶體中移除 中繼資料也會一併移除

設定

組合是一組與陣列類似的可疊代值 但 Set 只能包含唯一值。如同地圖,請對 Set 會保留加入的順序元素。

如要建立 Set,請使用 Set() 建構函式:

const mySet = new Set();

mySet;
> Set []

您也可以透過陣列常值建立集合:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

由於 Set 不允許使用重複的元素,因此當您透過某個集合建立 Set 時, 包含多個相同值的例項,但只會保留第一個 值:

const mySet = new Set([ 1, 2, 3, 2 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

如要在 Set 中新增或移除元素,請使用沿用自 Set 的方法 建構函式中設定。這些方法會根據元素的值處理元素 ,而不是參照索引:

const mySet = new Set();

mySet.add( "My value." );

mySet;
> Set [ "My value." ]

mySet.has( "My value." );
> true

mySet.delete( "My value." );

mySet;
> Set []

雖然組合不會編入索引,因為它們不是做為用來 因此集合中的元素會疊代 。嘗試在組合中加入重複的元素值有: 已略過,保留原始廣告訂單:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

mySet.add( 2 );
> Set(3) [ 1, 2, 3 ]

如要從 Set 建立陣列,請使用 Array.from() 方法或分散 語法:

const mySet = new Set([ 1, 2, 3 ]);
const myArray = Array.from( mySet );

myArray;
> Array(3) [ 1, 2, 3 ]

[ ...mySet ];
> Array(3) [ 1, 2, 3 ]

WeakSet

WeakSet 是僅包含垃圾收集值的組合。 例如參照物件或 Symbol 尚未新增至全域符號註冊資料庫

如要建立 WeakSet,請使用 WeakSet() 建構函式:

const myWeakSet = new WeakSet();

myWeakSet;
> WeakSet []

WeakSet 語法與 Set 類似,但 WeakSet 並未 iterable 的所有屬性 物件或符號以外的任何值都會造成語法錯誤。如同 WeakMap 沒有其他參照 某個 WeakSet 所參照的值, 垃圾收集

這適用於各種用途,例如匯總單一且可疊代集合 關聯物件如果 WeakSet 也會從 WeakSet 中移除相關的元素。

隨堂測驗

請看看下方範例:

        const myMap = new Map([ [ "myKey", "My string" ] ]);
        myMap.set( "myKey", 100 );
      

myMap 會傳回什麼?

undefined
"My string"
100