主要知識點:Set的基本操做,Weak Set,Map的基本操做,Weak Map
ES6 提供了新的數據結構 Set。它相似於數組,可是成員的值都是惟一的,沒有重複的值。segmentfault
Set 自己是一個構造函數,用來生成 Set 數據結構。數組
let set = new Set(); set.add(5); set.add("5"); console.log(set.size); // 2
可使用數組來初始化一個 Set ,而且 Set 構造器會確保不重複地使用這些值:數據結構
let set = new Set([1, 2, 3, 4, 5, 5, 5, 5]); console.log(set.size); // 5
使用 has() 方法來測試某個值是否存在於 Set 中:函數
let set = new Set(); set.add(5); set.add("5"); console.log(set.has(5)); // true console.log(set.has(6)); // false
使用 delete() 方法來移除單個值,或調用 clear() 方法來將全部值從 Set 中移除。測試
let set = new Set(); set.add(5); set.add("5"); console.log(set.has(5)); // true set.delete(5); console.log(set.has(5)); // false console.log(set.size); // 1 set.clear(); console.log(set.has("5")); // false console.log(set.size); // 0
forEach() 方法會被傳遞一個回調函數,該回調接受三個參數:spa
let set = new Set([1, 2]); set.forEach(function(value, key, ownerSet) { console.log(key + " " + value); console.log(ownerSet === set); }); // 輸出 1 1 true 2 2 true
let set = new Set([1, 2, 3, 3, 3, 4, 5]), array = [...set]; console.log(array); // [1,2,3,4,5]
能夠用此方法進行數組去重:code
function eliminateDuplicates(items) { return [...new Set(items)]; } let numbers = [1, 2, 3, 3, 3, 4, 5], noDuplicates = eliminateDuplicates(numbers); console.log(noDuplicates); // [1,2,3,4,5]
Set的引用類型:對象存儲在 Set 的一個實例中時,實際上至關於把對象存儲在變量中。只要對於 Set 實例的引用仍然存在,所存儲的對象就沒法被垃圾回收機制回收,從而沒法釋放內存。對象
let set = new Set(), key = {}; set.add(key); console.log(set.size); // 1 // 取消原始引用 key = null; console.log(set.size); // 1 // 從新得到原始引用 key = [...set][0];
當 JS 代碼在網頁中運行,同時你想保持與 DOM 元素的聯繫,在該元素可能被其餘腳本移除的狀況下,你應當不但願本身的代碼保留對該 DOM 元素的最後一個引用(這種狀況被稱爲內存泄漏)。
Weak Set
該類型只容許存儲對象弱引用,而不能存儲基本類型的值。對象的弱引用在它本身成爲該對象的惟一引用時,不會阻止垃圾回收:
建立 Weak Setblog
let set = new WeakSet(), key = {}; // 將對象加入 set set.add(key); console.log(set.has(key)); // true set.delete(key); console.log(set.has(key)); // false
和Set的區別:
const ws = new WeakSet(); ws.add(1) // TypeError: Invalid value used in weak set ws.add(Symbol()) // TypeError: invalid value used in weak set
ES6 的 Map 類型是鍵值對的有序列表,而鍵和值均可以是任意類型。
let map = new Map(); map.set("title", "Understanding ES6"); map.set("year", 2016); console.log(map.get("title")); // "Understanding ES6" console.log(map.get("year")); // 2016
若是任意一個鍵不存在於 Map 中, 則 get() 方法就會返回特殊值 undefined
能夠將對象做爲鍵,這些鍵不會被強制轉換成其餘形式,每一個對象就都被認爲是惟一的
let map = new Map(), key1 = {}, key2 = {}; map.set(key1, 5); map.set(key2, 42); console.log(map.get(key1)); // 5 console.log(map.get(key2)); // 42
屬性:size
let map = new Map(); map.set("name", "Nicholas"); map.set("age", 25); console.log(map.size); // 2 console.log(map.has("name")); // true console.log(map.get("name")); // "Nicholas" console.log(map.has("age")); // true console.log(map.get("age")); // 25 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 構造器,以便使用數據來初始化一個 Map 。該數組中的每一項也必須是數組,內部數組的首個項會做爲鍵,第二項則爲對應值:
let map = new Map([["name", "Nicholas"], ["age", 25]]); 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
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