ES6 Set/WeakSet

ES6里加入了一个新数据解构Set,和Java的Set一样,它里面不存放重复的元素。Set实现为一个,使用时需要先new。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var s1 = new Set()
s1.add(1)
s1.add(2)
s1.add(3)
s1.add(1)
 
var s2 = new Set()
s2.add('a')
s2.add('a')
 
// 输出1,2, 3
for (var i of s1 ) {
    console.log(i)
}
// 输出a
for (var i of s2 ) {
    console.log(i)
}

上面用Set的add方法添加元素,重复添加的,不会存进去。

 

Set构造器还可以接受数组作为参数传入

1
2
var s3 = new Set([1,2,3,1])
s3.size // 3

可以看到重复的数字1依然没有放进去,另外取Set的长度使用size,不是length。

 

需要注意的是对于{}或[],它们是两个同的对象

1
2
3
4
var s4 = new Set()
s4.add({})
s4.add({})
s4.size // 2

 

一、遍历Set (for of)

1
2
3
4
5
6
7
8
9
var s1 = new Set()
s1.add(1)
s1.add(2)
s1.add(3)
 
// 输出1,2, 3
for (var i of s1) {
    console.log(i)
}

 

二、把Set转成数组

1
2
3
4
5
6
7
8
9
10
var s1 = new Set()
s1.add(1)
s1.add(2)
 
// toArray
var a1 = Array.from(s1)
Array.isArray(a1) // true
 
// or
var a1 = [...new Set(s1)]

  

三、利用Set给数组去重

1
2
3
4
function distinct(arr) {
    return Array.from(new Set(arr))
//  return [...new Set(arr)]
}

 

Set的属性

  • constructor
  • size

Set的方法

  • has(val) 判断是否存在该元素
  • add(val) 添加元素
  • delete(val) 删除元素
  • clear 删除所有元素
  • keys 
  • values
  • entries
  • forEach 遍历元素
  • map
  • filter

 

四、WeakSet

WeakSet和Set一样都不存储重复的元素,但有一些不同点 

1. 只存储对象类型元素

1
2
ws = new WeakSet()
ws.add(1)

FF下报错如下

 

2. 只有add/delete/clear/has三个方法,不能遍历,没有size属性等

1
2
3
ws = new WeakSet()
ws.size // undefined
ws.forEach // undefined

MDN的解释

WeakSet 对象中存储的对象值都是被弱引用的, 如果没有其他的变量或属性引用这个对象值, 则这个对象值会被当成垃圾回收掉. 正因为这样, WeakSet 对象是无法被枚举的, 没有办法拿到它包含的所有元素

WeakSet主要用来储存DOM节点,当这些节点从文档移除时,不会引发内存泄漏。

 

相关:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WeakSet

posted on   snandy  阅读(2368)  评论(3编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
历史上的今天:
2014-05-14 IE6/7/8中parseInt第一个参数为非法八进制字符串且第二个参数不传时返回值为0
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示