Set
Set 是不包含重復(fù)值的列表赖淤。常見的Set使用場(chǎng)景是檢查某個(gè)值是否存在.
Set實(shí)例需要用new Set()來創(chuàng)建,Set 構(gòu)造器實(shí)際上可以接收任意可迭代對(duì)象作為參數(shù)就谜。構(gòu)造器會(huì)使用迭代器來提取參數(shù)中的值。
Set 不會(huì)使用強(qiáng)制類型轉(zhuǎn)換來判斷值是否重復(fù)。這意味著 Set 可以同時(shí)包含數(shù)值 5 與 字符串 "5" 劈伴,將它們都作為相對(duì)獨(dú)立的項(xiàng)
Set方法:
- add() 向Set中添加項(xiàng)目
- size() 檢查Set中有多少項(xiàng)
- delete() 移除值
- has() 判斷值是否存在,返回布爾值
- clear() 清空Set
- forEach() 遍歷Set項(xiàng),需要傳入一個(gè)回調(diào)函數(shù),該函數(shù)接受3個(gè)參數(shù):1.Set中下個(gè)位置的值,2.與第一個(gè)參數(shù)相同的值(為了與Map,數(shù)組里的forEach函數(shù)保持參數(shù)一致) 3.目標(biāo)Set自身
WeakSet
為了解決大型項(xiàng)目中的內(nèi)存泄漏,引入了該對(duì)象弊攘。
該類型只允許存儲(chǔ)對(duì)象弱引用,而不能存儲(chǔ)基本類型的值摔癣。
Weak Set 與 Set 關(guān)鍵的差異:
- 對(duì)于 WeakSet 的實(shí)例奴饮,只要調(diào)用 add() 、 has() 或 delete() 方法時(shí)傳入了非對(duì)象的參數(shù)择浊,就會(huì)拋出錯(cuò)誤拐云;
- Weak Set 不可迭代,因此不能被用在 for-of 循環(huán)中近她;
- Weak Set 無法暴露出任何迭代器(例如 keys() 與 values() 方法)叉瘩,因此沒有任何編程手段可用于判斷 Weak Set 的內(nèi)容;
- Weak Set 沒有 forEach() 方法粘捎;
- Weak Set 沒有 size 屬性薇缅。
Map
Map 是鍵與相對(duì)應(yīng)的值的集合危彩。通過指定所需讀取的鍵即可檢索對(duì)應(yīng)的值。 Map 常被用作緩存泳桦,存儲(chǔ)數(shù)據(jù)以便此后快速檢索汤徽。類型是鍵值對(duì)的有序列表,而鍵和值都可以是任意類型灸撰。
size屬性表示map中的鍵值對(duì)數(shù)量
Map初始化
將數(shù)組傳遞給 Map 構(gòu)造器谒府,以便使用數(shù)據(jù)來初始化一個(gè) Map 。該數(shù)組中的每一項(xiàng)也必須是數(shù)組浮毯,內(nèi)部數(shù)組的首個(gè)項(xiàng)會(huì)作為鍵完疫,第二項(xiàng)則為對(duì)應(yīng)值。因此整個(gè) Map 就被這些雙項(xiàng)數(shù)組所填充债蓝。
let map = new Map([["name", "Polo"], ["age", 30]]);
console.log(map.has("name")); // true
console.log(map.get("name")); // "Polo"
console.log(map.has("age")); // true
console.log(map.get("age")); // 30
console.log(map.size); // 2
Map方法:
- set(key,val) 設(shè)置鍵值對(duì)
- get(key) 獲得key對(duì)應(yīng)的值
- has(key) 判斷key是否存在
- delete(key) 刪除key及對(duì)應(yīng)的值
- clear() 清空map
- forEach(cb) cb是一個(gè)能接收三個(gè)參數(shù)的回調(diào)函數(shù) 1.Map中下個(gè)位置的值,2.值對(duì)應(yīng)的key,3.目標(biāo)Map自身
let map = new Map([ ["name", "Nicholas"], ["age", 25]]);
map.forEach(function(value, key, ownerMap) {
console.log(key + " " + value);
console.log(ownerMap === map);
});
WeakMap
WeakMap是存儲(chǔ)對(duì)象弱引用的方式壳鹤。所有的鍵都必須是對(duì)象,使用非對(duì)象的鍵會(huì)拋出錯(cuò)誤,而且這些對(duì)象都是弱引用饰迹,不會(huì)干擾垃圾回收芳誓。。當(dāng) Weak Map 中的鍵在 Weak Map 之外不存在引用時(shí)啊鸭,該鍵值對(duì)會(huì)被移除锹淌。
Weak Map 只有兩個(gè)附加方法能用來與鍵值對(duì)交互。 has() 方法用于判斷指定的鍵是否存在于 Map 中赠制,而 delete() 方法則用于移除一個(gè)特定的鍵值對(duì)赂摆。不能clear,也不能forEach,因?yàn)椴豢傻?/p>
可以利用WeakMap在對(duì)象實(shí)例中存儲(chǔ)私有數(shù)據(jù)。舉例如下:
let Person = (function() {
let privateData = new WeakMap();
function Person(name) {
privateData.set(this, { name: name });
}
Person.prototype.getName = function() {
return privateData.get(this).name;
};
return Person;
}());
此版本的 Person 范例使用了 Weak Map 而不是對(duì)象來保存私有數(shù)據(jù)憎妙。
當(dāng) Person 構(gòu)造器被調(diào)用時(shí)库正,將 this 作為鍵在 Weak Map 上建立了一個(gè)入口,而包含私有信息的對(duì)象成為了對(duì)應(yīng)的值厘唾,其中只存放了 name 屬性褥符。通過將 this 傳遞給 privateData.get() 方法,以獲取值對(duì)象并訪問其 name 屬性抚垃, getName() 函數(shù)便能提取私有信息喷楣。這種技術(shù)讓私有信息能夠保持私有狀態(tài),并且當(dāng)與之關(guān)聯(lián)的對(duì)象實(shí)例被銷毀時(shí)鹤树,私有信息也會(huì)被同時(shí)銷毀铣焊。