ECMAScript6中Set/WeakSet详解


Posted in Javascript onJune 12, 2015

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

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构造器还可以接受数组作为参数传入

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

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

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

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

一、遍历Set (for of)

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转成数组

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给数组去重

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

ECMAScript6中Set/WeakSet详解

Set的属性

constructor
size
Set的方法

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

四、WeakSet

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

1. 只存储对象类型元素

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

FF下报错如下

ECMAScript6中Set/WeakSet详解

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

ws = new WeakSet()
ws.size // undefined
ws.forEach // undefined

MDN的解释

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

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

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
jquery中ajax学习笔记一
Oct 16 Javascript
鼠标经过tr时,改变tr当前背景颜色
Jan 13 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
Mar 21 Javascript
JS更改select内option属性的方法
Oct 14 Javascript
js点击按钮实现带遮罩层的弹出视频效果
Dec 19 Javascript
浅析JSONP技术原理及实现
Jun 08 Javascript
微信小程序 教程之WXSS
Oct 18 Javascript
信息滚动效果的实例讲解
Sep 18 Javascript
解决Jquery下拉框数据动态获取的问题
Jan 25 jQuery
vue scroller返回页面记住滚动位置的实例代码
Jan 29 Javascript
vue2.0项目实现路由跳转的方法详解
Jun 21 Javascript
实现高性能javascript的注意事项
May 27 Javascript
JavaScript中的toLocaleDateString()方法使用简介
Jun 12 #Javascript
ECMAScript6块级作用域及新变量声明(let)
Jun 12 #Javascript
JavaScript中的toDateString()方法使用详解
Jun 12 #Javascript
ECMAScript6新增值比较函数Object.is
Jun 12 #Javascript
ECMAScript6函数剩余参数(Rest Parameters)
Jun 12 #Javascript
ECMAScript6函数默认参数
Jun 12 #Javascript
在JavaScript中操作时间之setYear()方法的使用
Jun 12 #Javascript
You might like
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
php实现单链表的实例代码
2013/03/22 PHP
php中的常用魔术方法总结
2013/08/02 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
asp.net和php的区别点总结
2019/10/10 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
2016/08/01 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
深入理解Python中的super()方法
2017/11/20 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
2020/04/16 Python
Python自定义聚合函数merge与transform区别详解
2020/05/26 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
两道JAVA笔试题
2016/09/14 面试题
金融专业个人的自我评价
2013/10/18 职场文书
部队领导证婚词
2014/01/12 职场文书
会走路的树教学反思
2014/02/20 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
药店收银员岗位职责
2015/04/07 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android