Javascript--Set

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的方法

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特性

  1. 垃圾回收不考虑WeakSet,即被WeakSet引用时引用计数器不加一,所以对象不被引用时不管WeakSet是否在使用都将删除
  2. 因为WeakSet 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作
  3. 也是因为弱引用,WeakSet 结构没有keys( ),values( ),entries( )等方法和size属性
  4. 因为是弱引用所以当外部引用删除时,希望自动删除数据时使用 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);

转载自后盾人:https://doc.houdunren.com/js/6%20Set.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值