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 相关文章推荐
用javascript实现的图片马赛克后显示并切换加文字功能
Apr 21 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
May 23 Javascript
jQuery切换所有复选框选中状态的方法
Jul 02 Javascript
基于JavaScript实现熔岩灯效果导航菜单
Jan 04 Javascript
javascript中递归的两种写法
Jan 17 Javascript
Bootstrap表单简单实现代码
Mar 06 Javascript
vue-cli的webpack模板项目配置文件分析
Apr 01 Javascript
vue 插值 v-once,v-text, v-html详解
Jan 19 Javascript
关于Vue在ie10下空白页的debug小结
May 02 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
May 09 Javascript
vue实现element-ui对话框可拖拽功能
Aug 17 Javascript
详解vue-property-decorator使用手册
Jul 29 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
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
php分页思路以及在ZF中的使用
2012/05/30 PHP
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
2016/05/27 PHP
laravel框架中间件 except 和 only 的用法示例
2019/07/12 PHP
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
Nodejs为什么选择javascript为载体语言
2015/01/13 NodeJs
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
Nodejs如何搭建Web服务器
2016/03/28 NodeJs
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
详解AngularJS2 Http服务
2017/06/26 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
Python列表元素常见操作简单示例
2019/10/25 Python
Python json读写方式和字典相互转化
2020/04/18 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
大学生学习2014全国两会心得体会
2014/03/13 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
多媒体教室标语
2014/06/26 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
PHP命令行与定时任务
2021/04/01 PHP
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技