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)
方法,這個方法與嚴格等於的不一樣之處在於NaN
,Object.is(NaN, NaN)
返回的是true
。this
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的方法
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也不會引起內存泄露