set—ES6的新数据结构

本文深入探讨ES6中的Set和WeakSet数据结构,包括基本语法、遍历方式及应用案例,如数组去重、合并去重、交集和差集等。同时对比Set与WeakSet的区别,如成员类型、遍历性和引用计数机制。

set—ES6的新数据结构


在以往的javascript中,通常用 Array和Object来存储数据,但是在频繁操作数据的过程中查找或者统计并需要手动来实现,并不能简单的直接使用。 比如如何保证 Array 是去重的,如何统计 Object 的数据总数等,必须自己去手动实现类似的需求,不是很方便。 在 ES6 中为了解决上述痛点,新增了数据结构 Set 和 Map,它们分别对应传统数据结构 的“集合”和“字典”

set基本语法

Set类似于数组,但是数组内元素不重复。

可以定义一个空的 Set 实例,也可以在实例化的同时传入默认的数据。

let q = new Set()
let s=new Set([1,2,3,2])
console.log(s.add('hello'))//Set(4) {1, 2, 3, "hello"}
s.add('es').add('js')
console.log(s.delete('hello'))//true
console.log(s.clear())//undefined
console.log(s.has('es'))//false
console.log(s)//Set(0) {}
console.log(s.size)//0

可以简单总结一下:

set方法作用
add()向集合添加方法,返回添加之后的新集合
delete()删除集合某元素,返回boolean值
clear()清空集合,无返回值
size返回集合的长度
has()返回boolean值,判断集合是否包含某元素

下面看几个简单应用加深理解:

  • 数组去重
let arr=[1,2,3,4,5,2,2,3]
let s=new Set(arr)
console.log(s)//Set(5) {1, 2, 3, 4, 5}
let arr1=[1,2,3,4]
let arr2=[2,3,4,5,6]
let s=new Set([...arr1,...arr2])//ES6解构赋值
console.log(s)//Set(6) {1, 2, 3, 4, 6}
let s1=new Set(arr1)
let s2=new Set(arr2)
let result=new Set(arr1.filter(item=>s2.has(item)))//set不支持filter方法
console.log(Array.from(result))
  • 差集
let arr3=new Set(arr1.filter(item=>!s2.has(item)))
let arr4=new Set(arr2.filter(item=>!s1.has(item)))
console.log(arr3)
console.log(arr4)
console.log([...arr3,arr4])

set的遍历方式

set的遍历方式和数组的遍历方式基本一样

  • forEach():使用回调函数遍历每个成员

  • for…of:可以直接遍历每个成员

  • keys():返回键名的遍历器

  • values():返回键值的遍历器

  • entries():返回键值对的遍历器

let s=new Set(["hello","goodbye"])
console.log(s.keys()) // SetIterator {"hello", "goodbye"}
console.log(s.values()) // SetIterator {"hello", "goodbye"}
console.log(s.entries()) // SetIterator {"hello" => "hello", "goodbye" => "goodbye"}
s.forEach(item => {
    console.log(item) // hello // goodbye
})

for (let item of s) {
    console.log(item)// hello // goodbye
}

for (let item of s.keys()) {
    console.log(item)// hello // goodbye
}

for (let item of s.values()) {
    console.log(item)// hello // goodbye
}

for (let item of s.entries()) {
    console.log(item[0], item[1])// hello hello// goodbye goodbye
}

weakset

WeakSet 结构与 Set 类似,也是不重复的值的集合。但是,它与 Set 有两个区别。
WeakSet 的成员只能是对象,而不能是其他类型的值。

const ws = new WeakSet()
ws.add(1)
// TypeError: Invalid value used in weak set
ws.add(Symbol())
// TypeError: invalid value used in weak set
let ws = new WeakSet()
const obj1 = {
    name: 'imooc'
}
const obj2 = {
    age: 5
}
ws.add(obj1)
ws.add(obj2)
ws.delete(obj1)
console.log(ws)
console.log(ws.has(obj2))

WeakSet 没有size属性,没有办法遍历它的成员。

WeakSet 中的对象都是弱引用,即垃圾回收机制(可以简单理解为对象每被引用一次就会+1 只要对象不为0 就不会被回收 一直+1会造成内存泄漏),不考虑 WeakSet 对该对象的引用,即不存在以上垃圾回收机制的问题 引用了就为1 没引用就为0 不存在内存泄漏的问题,适合临时存放一些对象、与对象绑定一些相关的信息(对象销毁后,绑定的信息自动会消失)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值