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 sortable效果 代码有错但值得看看
Nov 05 Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
Jun 05 Javascript
使用js显示当前时间示例
Mar 02 Javascript
深入理解javascript原型链和继承
Sep 23 Javascript
深入分析JQuery和JavaScript的异同
Oct 23 Javascript
jQuery实现仿百度帖吧头部固定导航效果
Aug 07 Javascript
常用的JQuery函数及功能小结
Mar 24 Javascript
基于jQuery实现选项卡效果
Jan 04 Javascript
Vue实例中生命周期created和mounted的区别详解
Aug 25 Javascript
vue axios数据请求get、post方法及实例详解
Sep 11 Javascript
小程序实现授权登陆的解决方案
Dec 02 Javascript
Echarts实现单条折线可拖拽效果
Dec 19 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 MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
浅谈JavaScript实现面向对象中的类
2014/12/09 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
2015/03/26 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
2017/06/29 Javascript
JavaScript中的一些隐式转换和总结(推荐)
2017/12/22 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
JS监听滚动和id自动定位滚动
2018/12/18 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
Python爬虫包 BeautifulSoup  递归抓取实例详解
2017/01/28 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
PHP如何与mysql建立链接
2013/05/05 面试题
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
树转促学习心得体会
2014/09/10 职场文书
防灾减灾标语
2014/10/07 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
2015年试用期自我评价范文
2015/03/10 职场文书
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL