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 相关文章推荐
微博@符号的用户名提示效果。(想@到谁?)
Nov 05 Javascript
利用js实现遮罩以及弹出可移动登录窗口
Jul 08 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
Mar 26 Javascript
理解javascript中try...catch...finally
Dec 25 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
Jun 03 Javascript
jquery实现全选、全不选以及单选功能
Mar 23 jQuery
node中使用es5/6以及支持性与性能对比
Aug 11 Javascript
Nuxt.js实战详解
Jan 18 Javascript
vue router 配置路由的方法
Jul 26 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
Sep 17 Javascript
javascript实现时间日期的格式化的方法汇总
Aug 06 Javascript
vue+Element-ui前端实现分页效果
Nov 15 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实现jQuery扩展函数
2009/10/30 PHP
解析php扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
2014/05/20 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
利用vue.js插入dom节点的方法
2017/03/15 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
2017/04/13 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
Angular.JS中的this指向详解
2017/05/17 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
原生JS实现留言板
2020/03/26 Javascript
python网络编程实例简析
2014/09/26 Python
python用来获得图片exif信息的库实例分析
2015/03/16 Python
详细讲解用Python发送SMTP邮件的教程
2015/04/29 Python
python实现识别相似图片小结
2016/02/22 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
食品采购员岗位职责
2014/04/14 职场文书
安全生产月活动总结
2014/05/04 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
英语教师求职信范文
2015/03/20 职场文书
2015年国庆节寄语
2015/08/17 职场文书
2016党员干部政治学习心得体会
2016/01/23 职场文书