javascript新增長的數據結構: Set Map WeakSet WeakMap

1、Set

ES6提供新的數據結構Set,相似於Array,不過Array中的值能夠重複,可是Set中的值不能夠重複數組

聲明: Set函數是一個構造函數  數據結構

let set = new Set([1,2,3,2]) 

console.log((new Set([1,2,3,2])).size) // 3
console.log((new Set([NaN, NaN])).size) // 1
console.log((new Set([{}, {}])).size) // 2
console.log((new Set([{a: 'a'}, {a: 'a'}])).size) //2
a = {a: 'a'}
console.log((new Set([a, a])).size) // 1
b = {a: 'a'}
console.log((new Set([a, b])).size) //2
Set數據結構判斷相等的方式與===相似,可是優化了NaN的判斷(這裏能夠原來判斷NaN)
Set數據結構的屬性:
Set.prototype.constructor: 構造函數,默認爲Set函數,new Set([1]).constructor === Set // true
Set.prototype.size: 返回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

entries 返回鍵值對組成的遍歷器
 
Set與數組的區別
Array Set都實現了遍歷器
Array中的值能夠重複,可是Set中的值不能夠重複
Array中有鍵(0,1,2),遍歷可使用arr[0]
Set中只有值,沒有鍵,遍歷可使用forEach, for of

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 ]

2、WeakSet

與Set的區別:對象

  1. WeakSet中的成員只能是對象,Set能夠是任何類型
  2. WeakSet中的對象都是弱引用。垃圾回收是不會考慮對象在不在WeakSet中,因此WeakSet是不可引用的,是不能遍歷的

 添加進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的實例上調用。

3、Map

Object是字符串-值結構,它的鍵必須是字符串。

Map是值-值,它的鍵能夠是任何類型的。

若是須要鍵值對的數據結構,Map更加合適。

let a = new Map([['name', 'wt'], ['age', 25]]) 構造函數,接受數組做爲參數
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;
}

 

4、WeakMap

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標準入門》

相關文章
相關標籤/搜索