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也不会引起内存泄露