Set 用于存储任何类型的唯一值,通常配合数组进行使用,可以用来对数组进行去重
例如:
let arr=[1,2,3,3,'xx','xx']
let set =new Set(arr)
console.log(set);//Set(4) {1, 2, 3, 'xx'}
arr=Array.from(set)//Array.from 把类数组变为数组
console.log(arr);//(4) [1, 2, 3, 'xx']
Set的基本使用
new Set()
如果要在new Set()的时候进行赋值,需要用可以**迭代的**对象,数组、字符串等,**不能用对象类型的**,可迭代的对象需要自定义,普通对象是不可迭代的
Set 中是严格类型约束的,下面的数值1与字符串1属于两个不同的值,而对象里面如果使用1和'1'作为属性,会发生覆盖
let set0 =new Set('xz123')
console.log(set0);//Set(5) {'x', 'z', '1', '2', '3'}
let set =new Set('xxxxxx')
console.log(set);//Set(1) {'x'}
let arr=[1,'1',2,3,3,'xx','xx']
let set1 =new Set(arr)//这样是一次添加多个值
console.log(set1);//Set(5) {1, '1', 2, 3, 'xx'}
set的方法
entries()
let set=new Set(["xiaoz","en",'xz','123344']);
console.log(set.entries())
//SetIterator {'xiaoz' => 'xiaoz', 'en' => 'en', 'xz' => 'xz', '123344' => '123344'}
add()
let set=new Set(["xiaoz","en",'xz','123344']);
console.log(set.add({xzz:'xzz'}));
delete()
let set=new Set(["xiaoz","en",'xz','123344']);
console.log(set.delete("xiaoz"));//true
values()
let set=new Set(["xiaoz","en",'xz','123344']);
console.log(set.values());//SetIterator {'xiaoz', 'en', 'xz', '123344'}
clear()
let set=new Set(["xiaoz","en",'xz','123344']);
set.clear()//没有返回值 清空了
size
注意,这不是一个function ,这和array.length用法一样
let set=new Set(["xiaoz","en",'xz','123344']);
console.log(set.size);//4
forEach
set也可以使用foreach,vaLue和key 一样,因为set没有索引
set.forEach(function(value,key,arr){
console.log(value);
console.log(key);
})
WeakSet
WeakSet结构同样不会存储重复的值,它的成员必须只能是引用类型的值。
以下操作由于数据不是对象类型将产生错误:
new WeakSet(["hdcms", "houdunren"]); //Invalid value used in weak set
new WeakSet([["hdcms"], ["houdunren"]]);//这样就是添加了两个数组, 0: Array(1) 1: Array(1)
new WeakSet("hdcms"); //Invalid value used in weak set
//这里不是添加的数组,而是添加了两个值
let set= new WeakSet([["hdcms"], ["houdunren"]])
set.add('xxxxx')//Invalid value used in weak set
set.add([1,2,3])
console.log(set);
WeakSet特性
- 垃圾回收不考虑WeakSet,即被WeakSet引用时引用计数器不加一,所以对象不被引用时不管WeakSet是否在使用都将删除
- 因为WeakSet 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作
- 也是因为弱引用,WeakSet 结构没有keys( ),values( ),entries( )等方法和size属性
- 因为是弱引用所以当外部引用删除时,希望自动删除数据时使用 WeakMap
基本操作
下面是WeakSet的常用指令
const hd = new WeakSet();
const arr = ["hdcms"];
//添加操作
hd.add(arr);
console.log(hd.has(arr));
//删除操作
hd.delete(arr);
//检索判断
console.log(hd.has(arr));
垃圾回收
WeaSet保存的对象不会增加引用计数器,如果一个对象不被引用了会自动删除。
-
下例中的数组被 arr 引用了,引用计数器+1
-
数据又添加到了 hd 的WeaSet中,引用计数还是1
-
当 arr 设置为null时,引用计数-1 此时对象引用为0
-
当垃圾回收时对象被删除,这时WakeSet也就没有记录了
const hd = new WeakSet();
let arr = ["hdcms"];
hd.add(arr);
console.log(hd.has(arr));
arr = null;
console.log(hd); //WeakSet {Array(1)}
setTimeout(() => {
console.log(hd); //WeakSet {}
}, 1000);