Javascript Set与WeakSet

作为ES6新增特性,Set是一种新的集合类型,为这门语言带来了集合数据结构。Set在很多方面都像加强的Map,这是因为它们大多API和行为是共有的。

  1. Set基本API

创建set

const s = new Set()

add:添加值

const s = new Set()
s.add(1)
s.add(2).add(3)
console.log(s) //{ 1 2, 3 }
add返回集合实例,所以可以将多个添加操作串联起来

has: 判断是否有该成员

console.log(s.has(1)) //true

delet:删除该成员

s.delete(1)
console.log(s) //{ 2, 3 }

clear:清空

s.clear()
console.log(s) //{}

size:获取有几个值(属性)

console.log(s.size) //0
  1. Set特点

Set的值可以是Js中任意数据类型

//创建的同时初始化,可以传入一个可迭代对象
const s = new Set([function () { }, Symbol(), new Object()])
console.log(s) //{ [Function (anonymous)], Symbol(), {} }

Set内部的判等方式基本上相当于使用严格相等(===),除了NaN,Set中的NaN等于NaN

const s = new Set()
const a = parseFloat('a')
const b = parseInt('b')
s.add(a)
console.log(s.has(b)) //true

Set会维护插入的顺序

const s = new Set()
s.add(4).add(2).add(1)
console.log(s) //{ 4, 2, 1 }

Set迭代

const s = new Set([10, 20, 30])
for (let value of s) {
  console.log(value) //10 20 30
}
//s.forEach(function(value,key,set){},this指向)  //value:每个成员,key等于value,没啥用,set:s本身
s.forEach((value, key, s) => {
  console.log(value, key, s)
})
10 10 Set(3) { 10, 20, 30 }
20 20 Set(3) { 10, 20, 30 }
30 30 Set(3) { 10, 20, 30 }

无序:set没有下标去标识每一个值,所以是无序的,也不能像数组那样通过下标去访问set的成员

无重复值

const s = new Set()
s.add(1)   
s.add(2).add(1)
console.log(s)  //{ 1, 2 }

什么时候使用Set?

数组或字符串去重时;

不需要通过下标访问,只需要遍历时;

为了使用Set提供的方法和属性时。

  1. 强引用与弱引用

可查看我的另一篇博客——Javascript Map与WeakMap

  1. WeakSet

ES6新增“弱集合”,也是一种新的集合类型,weak描述的是垃圾回收程序对待“弱集合”中值的方式(即弱引用)

WeakSet 基本API

const s = new WeakSet()
const obj1 = { name: '张三' },
  obj2 = { name: '李四' },
  obj3 = { name: '王五' }
s.add(obj1).add(obj2).add(obj3)
console.log(s.has(obj1)) //true
s.delete(obj1)
console.log(s.has(obj1)) //false

区别于Set,WeakSet的基本API仅有如上,它没有clear和size

WeakSet特点

1 WeakSet的值只能是Object或者继承自Object的类型,如上述代码所示。

2“weak”,表示这些值不属于正式的引用,不会阻止垃圾回收。

3 不可迭代,因为弱集合中的值可能随时被销毁,所以没必要提供迭代的能力,也不用像clear一次性清空所有,所以也没有clear方法。

什么时候使用WeakSet?

由于WeakSet不会妨碍垃圾回收,所以它很适合应用于某元素用完就应该立即被释放的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值