您可以使用物件常值來儲存鍵/值組合,並使用陣列儲存鍵/值組合 可疊代集合的值。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
會傳回什麼?
100
"My string"
undefined