ES6提供新的數據結構Set,相似於Array,不過Array中的值能夠重複,可是Set中的值不能夠重複數組
聲明: Set函數是一個構造函數 數據結構
1 interface Set<T> { 2 add(value: T): this; // 增長值,返回Set實例自己,能夠連調 new Set().add({}).add({}) 3 clear(): void; // 清除全部值 4 delete(value: T): boolean; // 刪除值,刪除成功返回true 5 forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): void; // 遍歷Set,接受回調函數和this對象,回調函數的參數有3個,值,鍵,set自己,Set數據結構中沒有鍵,因此鍵===值, 6 has(value: T): boolean; // value是否在Set中 7 readonly size: number; // 返回Set的成員數量 8 }
由於Set是實現了遍歷器接口,因此有以下方法函數
keys 返回鍵組成的遍歷器優化
values 返回值組成的遍歷器this
Set的遍歷spa
能夠直接使用for of進行遍歷prototype
Set的應用code
1 // 數組去重複(基本數據類型) 2 console.log(Array.from(new Set([1,2,1]))) // [1, 2] 3 console.log([...new Set([1,2,1])]) // [1, 2] 4 5 a = [1, 2, 3] 6 b = [4, 3, 2] 7 // 數組並集 8 console.log([...new Set([...a, ...b])]) // [ 1, 2, 3, 4 ]
與Set的區別:對象
添加進WeakSet的元素對象,WeakSet不會對元素對像的引用計數加1,對於被添加進WeakSet的元素對象,只要該元素對象沒有被除WeakSet之外的其餘對象引用,就會被垃圾回收釋放,在WeakSet中的該元素對象自動被釋放,不會出現內存泄漏。blog
1 var ws = new WeakSet(); 2 var foo = {}; 3 ws.add(foo); 4 console.log(ws.has(foo)) // true 5 ws.delete(foo); 6 console.log(ws.has(foo)) //false
interface WeakSet<T extends object> { add(value: T): this; delete(value: T): boolean; has(value: T): boolean; }
WeakSet的一個用法是存觸DOM節點,而不用擔憂這些節點從文檔移除時發生內存泄露。
1 class Foo { 2 constructor() { 3 ws.add(this); 4 } 5 method() { 6 if(!ws.has(this)) { 7 throw new TypeError('method只能在實例中使用') 8 } 9 } 10 }
保證Foo的實例方法只能在Foo的實例上調用。
Object是字符串-值結構,它的鍵必須是字符串。
Map是值-值,它的鍵能夠是任何類型的。
若是須要鍵值對的數據結構,Map更加合適。
interface Map<K, V> { clear(): void; delete(key: K): boolean; forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void; get(key: K): V | undefined; has(key: K): boolean; set(key: K, value: V): this; readonly size: number; }
WeakMap與Map基本相同,不過WeakMap的鍵必須是對象,而且是對象的弱引用。(垃圾回收機制不考慮是否在WeakMap中)
WeakMap專門用來在它的鍵對應的對象可能在未來會消失。有助於防止內存泄露。
1 let a = ['name', 'wt'] 2 let m = new Map().set(a, 'mmm') 3 console.log(m.get(a)) // mmm 4 a = null; 5 console.log(m.get(a)) // undefined
參考:《ES6標準入門》