在以往的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}
- 合并去重
用到了ES6的解构赋值,可参考: https://blog.youkuaiyun.com/juliaandjulia/article/details/107453707
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}
- 交集
用到了数组的遍历方法filter,可参考: https://blog.youkuaiyun.com/juliaandjulia/article/details/107452191
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 不存在内存泄漏的问题,适合临时存放一些对象、与对象绑定一些相关的信息(对象销毁后,绑定的信息自动会消失)
本文深入探讨ES6中的Set和WeakSet数据结构,包括基本语法、遍历方式及应用案例,如数组去重、合并去重、交集和差集等。同时对比Set与WeakSet的区别,如成员类型、遍历性和引用计数机制。
1053

被折叠的 条评论
为什么被折叠?



