ES6學習之 -- Set數據結構

Set

Set相似於數組,可是Set中不存在重複元素。
Set能夠接受一個數組(或者其餘具備itarable接口的數據結構)做爲參數數組

const set = new Set([1,1,2,3,4,5,4,5]);
console.log([...set]);//[1, 2, 3, 4, 5]

從上面的代碼能夠看出Set有去重的功能。[...new Set(arr)]
去重還有另外一個方法,Array.from將Set數據結構的數據轉換成數組。數據結構

function removelArr(arr) {
    return Array.from(new Set(arr));
}
removelArr([1, 1, 2, 3, 2, '1']);//[1, 2, 3, '1']
或者
[...new Set([1, 1, 2, 3, 2, '1'])];//[1, 2, 3, '1']

Set加入值的時候不會發生類型轉變函數

const set = new Set([1,'1']);
console.log([...set]);//[1, '1']

Set內部判斷兩個值是否相同使用了Object.is(a, b)方法,這個方法與嚴格等於的不一樣之處在於NaNObject.is(NaN, NaN)返回的是truethis

let a = NaN;
let b = NaN;
let set = new Set();
set.add(a);
set.add(a);
console.log([...set]);//[NaN]

捎帶提一下兩個對象的老是不相等的,這就不用多說了吧,內存地址不一樣。。。prototype

let obj1 = {};
let obj2 = {};
let set = new Set();
set.add(obj1);
set.add(obj2);
console.log([...set]);//[{}, {}]

Set的屬性code

  • size:獲取成員個數

Set的方法對象

  • add(value):增長一個成員,返回值爲set結構自己
  • delete(value):刪除某個成員,返回值是一個布爾值,是否刪除成功
  • clear():清空全部成員,無返回值
  • has(value):判斷是否有某個成員,返回一個布爾值,是否存在某個元素接口

    let set = new Set();
    set.add(1).add(2).add(2).add('1');
    set.size;//3
    set.delete('1');//true
    set.size;//2
    set.has(2);//true
    set.clear();
    set.size;//0

Set的遍歷操做內存

  • keys():返回鍵名的遍歷器rem

    let set = new Set([1, 1, 2, 3, 2, '1']);
    //由於keys返回的是遍歷器,因此可使用`for...of`,數組沒有鍵名只有鍵值,因此keys和values返回的是一致的
    for(let item of set.keys()){
        console.log(item);// 1 2 3 '1'
    }
  • values():返回值名的遍歷器

    let set = new Set([1, 1, 2, 3, 2, '1']);
    //由於values返回的是遍歷器,因此可使用`for...of`
    for(let item of set.values()){
        console.log(item);// 1 2 3 '1'
    }
  • entries():返回鍵值對的遍歷器

    //entries方法返回的遍歷器,同時包括鍵名和鍵值
    let set = new Set([1, 1, 2, 3, 2, '1']);
    //由於values返回的是遍歷器,因此可使用`for...of`
    for(let item of set.entries()){
        console.log(item);// [1, 1] [2, 2] [3, 3] ['1', '1']
    }
  • forEach():使用回調函數遍歷每一個成員

    let set = new Set([1, 4, 9]);
    set.forEach((value, key) => console.log(key + ' : ' + value))
    // 1 : 1
    // 4 : 4
    // 9 : 9

Set 結構的實例默承認遍歷,它的默認遍歷器生成函數就是它的values方法。

Set.prototype[Symbol.iterator] === Set.prototype.values
//true

這意味着咱們能夠直接遍歷Set

let set = new Set([1, 4, 9]);
for(let item of set) {
    console.log(item);//1 4 9
}

WeakSet

注意點:

  • WeakSet的成員只能是對象
  • WeakSet的成員是弱引用,隨時均可能消失,因此沒法遍歷也就沒法獲取成員數量

WeakSet的方法

  • add(value)向 WeakSet 實例添加一個新成員。
  • delete(value)清除 WeakSet 實例的指定成員。
  • has(value)返回一個布爾值,表示某個值是否在 WeakSet 實例之中。

WeakSet 的一個用處,是儲存 DOM 節點,而不用擔憂這些節點從文檔移除時,會引起內存泄漏。

下面是 WeakSet 的另外一個例子。

const foos = new WeakSet()
class Foo {
  constructor() {
    foos.add(this)
  }
  method () {
    if (!foos.has(this)) {
      throw new TypeError('Foo.prototype.method 只能在Foo的實例上調用!');
    }
  }
}

method只能經過Foo的實例調用否則就會拋出異常,當刪除實例的時候,不用操做foos也不會引起內存泄露

相關文章
相關標籤/搜索