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 DIV弹出效果实现代码
Jul 03 Javascript
javascript 面向对象全新理练之数据的封装
Dec 03 Javascript
父子窗体间传递JSON格式的数据的代码
Dec 25 Javascript
javascript中的绑定与解绑函数应用示例
Jun 24 Javascript
jQuery 获取浏览器所在的IP地址的小例子
Nov 08 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
Nov 22 Javascript
Javascript实现的SHA-256加密算法完整实例
Feb 02 Javascript
浅谈angularJS中的事件
Jul 12 Javascript
JavaScript无缝滚动效果的实例代码
Mar 27 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
May 20 Javascript
当vue路由变化时,改变导航栏的样式方法
Aug 22 Javascript
关于微信公众号开发无法支付的问题解决
Dec 28 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
提高jQuery性能优化的技巧
2015/08/03 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
jquery仿ps颜色拾取功能
2017/03/08 Javascript
AnglarJs中的上拉加载实现代码
2018/02/08 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
python和shell变量互相传递的几种方法
2013/11/20 Python
Apache如何部署django项目
2017/05/21 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
解决Python运行文件出现out of memory框的问题
2018/12/03 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
EJB与JAVA BEAN的区别
2016/08/29 面试题
2014年幼儿园工作总结
2014/11/10 职场文书
国家助学金感谢信
2015/01/21 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
检举信的写法
2019/04/10 职场文书