ES6(七)Set與Map2

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)存管理方面的特性讓它們成為了唯一合適的選擇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容