Set
Set 是不包含重復值的列表。常見的Set使用場景是檢查某個值是否存在.
Set實例需要用new Set()來創建,Set 構造器實際上可以接收任意可迭代對象作為參數。構造器會使用迭代器來提取參數中的值。
Set 不會使用強制類型轉換來判斷值是否重復。這意味著 Set 可以同時包含數值 5 與 字符串 "5" ,將它們都作為相對獨立的項
Set方法:
- add() 向Set中添加項目
- size() 檢查Set中有多少項
- delete() 移除值
- has() 判斷值是否存在,返回布爾值
- clear() 清空Set
- forEach() 遍歷Set項,需要傳入一個回調函數,該函數接受3個參數:1.Set中下個位置的值,2.與第一個參數相同的值(為了與Map,數組里的forEach函數保持參數一致) 3.目標Set自身
WeakSet
為了解決大型項目中的內存泄漏,引入了該對象。
該類型只允許存儲對象弱引用,而不能存儲基本類型的值。
Weak Set 與 Set 關鍵的差異:
- 對于 WeakSet 的實例,只要調用 add() 、 has() 或 delete() 方法時傳入了非對象的參數,就會拋出錯誤;
- Weak Set 不可迭代,因此不能被用在 for-of 循環中;
- Weak Set 無法暴露出任何迭代器(例如 keys() 與 values() 方法),因此沒有任何編程手段可用于判斷 Weak Set 的內容;
- Weak Set 沒有 forEach() 方法;
- Weak Set 沒有 size 屬性。
Map
Map 是鍵與相對應的值的集合。通過指定所需讀取的鍵即可檢索對應的值。 Map 常被用作緩存,存儲數據以便此后快速檢索。類型是鍵值對的有序列表,而鍵和值都可以是任意類型。
size屬性表示map中的鍵值對數量
Map初始化
將數組傳遞給 Map 構造器,以便使用數據來初始化一個 Map 。該數組中的每一項也必須是數組,內部數組的首個項會作為鍵,第二項則為對應值。因此整個 Map 就被這些雙項數組所填充。
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) 設置鍵值對
- get(key) 獲得key對應的值
- has(key) 判斷key是否存在
- delete(key) 刪除key及對應的值
- clear() 清空map
- forEach(cb) cb是一個能接收三個參數的回調函數 1.Map中下個位置的值,2.值對應的key,3.目標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是存儲對象弱引用的方式。所有的鍵都必須是對象,使用非對象的鍵會拋出錯誤,而且這些對象都是弱引用,不會干擾垃圾回收。。當 Weak Map 中的鍵在 Weak Map 之外不存在引用時,該鍵值對會被移除。
Weak Map 只有兩個附加方法能用來與鍵值對交互。 has() 方法用于判斷指定的鍵是否存在于 Map 中,而 delete() 方法則用于移除一個特定的鍵值對。不能clear,也不能forEach,因為不可迭代
可以利用WeakMap在對象實例中存儲私有數據。舉例如下:
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 而不是對象來保存私有數據。
當 Person 構造器被調用時,將 this 作為鍵在 Weak Map 上建立了一個入口,而包含私有信息的對象成為了對應的值,其中只存放了 name 屬性。通過將 this 傳遞給 privateData.get() 方法,以獲取值對象并訪問其 name 屬性, getName() 函數便能提取私有信息。這種技術讓私有信息能夠保持私有狀態,并且當與之關聯的對象實例被銷毀時,私有信息也會被同時銷毀。