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 相关文章推荐
csdn 批量接受好友邀请
Feb 19 Javascript
半角全角相互转换的js函数
Oct 16 Javascript
JavaScript 解析Json字符串的性能比较分析代码
Dec 16 Javascript
前台js改变Session的值(用ajax实现)
Dec 28 Javascript
javascript实现依次输入input自动定焦
Dec 23 Javascript
如何提高数据访问速度
Dec 26 Javascript
微信小程序 获取javascript 里的数据
Aug 17 Javascript
基于substring()和substr()的使用以及区别(实例讲解)
Dec 28 Javascript
JavaScript继承的特性与实践应用深入详解
Dec 30 Javascript
基于Express框架使用POST传递Form数据
Aug 10 Javascript
React路由鉴权的实现方法
Sep 05 Javascript
js判断非127开头的IP地址的实例代码
Jan 05 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
生成sessionid和随机密码的例子
2006/10/09 PHP
php基础知识:控制结构
2006/12/13 PHP
php+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
php实现点击可刷新验证码
2015/11/07 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
js 多种变量定义(对象直接量,数组直接量和函数直接量)
2010/05/24 Javascript
js导出格式化的excel 实例方法
2013/07/17 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
详解如何构建一个Angular6的第三方npm包
2018/09/07 Javascript
vue之延时刷新实例
2019/11/14 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
Python使用matplotlib绘制动画的方法
2015/05/20 Python
Python实现以时间换空间的缓存替换算法
2016/02/19 Python
python实现决策树分类算法
2017/12/21 Python
python实现最长公共子序列
2018/05/22 Python
对python Tkinter Text的用法详解
2018/10/11 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
strlen的几种不同实现方法
2013/05/31 面试题
经贸日语毕业生自荐信
2013/11/03 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
代领报检证委托书范本
2014/10/11 职场文书
政审证明范文
2015/06/19 职场文书
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫
MySQL数据库 安全管理
2022/05/06 MySQL