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 innerHTML使用分析
Dec 03 Javascript
jquery调用wcf并展示出数据的方法
Jul 07 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
Dec 08 Javascript
介绍一个简单的JavaScript类框架
Jun 24 Javascript
JavaScript取得键盘按下方向键是哪个的方法
Aug 04 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
Feb 23 Javascript
利用JavaScript实现拖拽改变元素大小
Dec 14 Javascript
微信小程序 Button 组件详解及简单实例
Jan 10 Javascript
js中getter和setter用法实例分析
Aug 14 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
Sep 19 Javascript
layui使用label标签的方法
Sep 14 Javascript
vue实现移动端图片上传功能
Dec 23 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聊天室技术
2006/10/09 PHP
PHP HTML代码串截取代码
2008/12/29 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
JavaScript实现的使用键盘控制人物走动实例
2014/08/27 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
jQuery处理XML文件的几种方法
2016/06/14 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
2020/03/14 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
python发送邮件实例分享
2017/07/28 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
python求解汉诺塔游戏
2020/07/09 Python
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
物理系毕业生自荐书范文
2014/02/22 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
道德与公民自我评价
2015/03/09 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
会议室管理制度范本
2015/08/06 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
python 中yaml文件用法大全
2021/07/04 Python
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL