ES6 的 Map
ES6 的 Map?類型是鍵值對的有序列表,而鍵和值都可以是任意類型。
鍵的比較使用的是Object.is() ,因此你能將 5 與 "5" 同時作為鍵,因?yàn)樗鼈冾愋筒煌?/p>
這與使用對象屬性作為鍵的方式(指的是用對象來模擬 Map )截然不同,因?yàn)閷ο蟮膶傩詴粡?qiáng)制轉(zhuǎn)換為字符 串。
let map = new Map();
map.set("title", "Understanding ES6");
map.set("year", 2016);
console.log(map.get("title"));
console.log(map.get("year"));
也可以將對象作為鍵:
let map = new Map(),
? ? key1 = {},
? ? key2 = {};
map.set(key1, 5);
map.set(key2, 42);
console.log(map.get(key1));
console.log(map.get(key2));
1. Map 的方法
2.?Map 的初始化
3.?Map 上的 forEach 方法
4.Weak Map
5.總結(jié)
Map 的方法
以下三個方法在 Map 與 Set 上都存在:
? ? ??has(key) :判斷指定的鍵是否存在于 Map 中;
? ? ??delete(key) :移除 Map 中的鍵以及對應(yīng)的值;
? ? ??clear() :移除 Map 中所有的鍵與值。
屬性:
????size
let map = new Map();
map.set("name", "Nicholas");
map.set("age", 25);
console.log(map.size);
console.log(map.has("name"));???// true
console.log(map.get("name"));???// "Nicholas"
console.log(map.has("age"));
console.log(map.get("age"));
map.delete("name");
console.log(map.has("name"));???// false
console.log(map.get("name"));???// undefined
console.log(map.size);??// 1
map.clear();
console.log(map.has("name"));???// false
console.log(map.get("name"));???// undefined
console.log(map.has("age"));????// false
console.log(map.get("age"));????// undefined
console.log(map.size);??// 0
Map 的初始化
將數(shù)組傳遞給 Map 構(gòu)造器
每一項(xiàng)也必須是數(shù)組,內(nèi)部數(shù)組的首個項(xiàng)會作為鍵,第二項(xiàng)則為對應(yīng)值
let map = new Map([["name", "Nicholas"], ["age", 25]]); // 雙數(shù)組
console.log(map.has("name"));???// true
console.log(map.get("name"));???// "Nicholas"
console.log(map.has("age"));????// true
console.log(map.get("age"));????// 25
console.log(map.size);??// 2
Map 上的 forEach 方法
let map = new Map([ ["name", "Nicholas"], ["age", 25]]);
map.forEach(function(value, key, ownerMap) {
? ? console.log(key + " " + value);
? ? console.log(ownerMap === map);
});
// name Nicholas
// true
// age 25
// true
Weak Map
let key1 = {},
? ? key2 = {},
? ? map = new WeakMap([[key1, "Hello"], [key2, 42]]);
console.log(map.has(key1));
console.log(map.get(key1));
console.log(map.has(key2));
console.log(map.get(key2));
用于關(guān)聯(lián)DOM:
let map = new WeakMap(),
element = document.querySelector(".element");
map.set(element, "Original");
console.log(map.has(element));??// true
console.log(map.get(element));??// "Original"
map.delete(element);
console.log(map.has(element));??// false
console.log(map.get(element));?// undefined
總結(jié)
Set 是無重復(fù)值的有序列表。
根據(jù) Object.is() 方法來判斷其中的值不相等,以保證無重 復(fù)。
?Set 會自動移除重復(fù)的值,因此你可以使用它來過濾數(shù)組中的重復(fù)值并返回結(jié)果。?
let aa = new Set([需要去重的數(shù)組]);
Set 并不是數(shù)組的子類型,所以你無法隨機(jī)訪問其中的值。
添加值add方法,set.add('s');
但你可以使用 has() 方法來判斷某個 值是否存在于 Set 中,或通過 size 屬性來查看其中有多少個值。
?Set?類型還擁有forEach()方法,用于處理每個值。
Weak Set 是只能包含對象的特殊 Set 。其中的對象使用弱引用來存儲,意味著當(dāng) Weak Set中的項(xiàng)是某個對象的僅存引用時,它不會屏蔽垃圾回收。由于內(nèi)存管理的復(fù)雜性,Weak Set的內(nèi)容不能被檢查,因此最好將 Weak Set 僅用于追蹤需要被歸組在一起的對象。
Map 是有序的鍵值對,其中的鍵允許是任何類型。
與 Set 相似,通過調(diào)用 Object.is() 方法 來判斷重復(fù)的鍵,這意味著能將數(shù)值 5? 與字符串 "5"?作為兩個相對獨(dú)立的鍵。
使用set() 方法能將任何類型的值關(guān)聯(lián)到某個鍵上,并且該值此后能用get()?方法提取出來。
Map 也擁有一個size 屬性與一個 forEach()?方法,讓項(xiàng)目訪問更容易。
Weak Map 是只能包含對象類型的鍵的特殊 Map 。與 Weak Set 相似,鍵的對象引用是弱引 用,因此當(dāng)它是某個對象的僅存引用時,也不會屏蔽垃圾回收。當(dāng)鍵被回收之后,所關(guān)聯(lián)的 值也同時從 Weak Map 中被移除。對于和對象相關(guān)聯(lián)的附加信息來說,若要在訪問它們的代 碼之外對其進(jìn)行生命周期管理(也就是說,當(dāng)在對象外部移除對象的引用時,要求其私有數(shù) 據(jù)也能一并被銷毀),則 Weak Map 在內(nèi)存管理方面的特性讓它們成為了唯一合適的選擇。