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与图片美化checkbox和radio控件的代码(打包下载)
Nov 11 Javascript
JavaScript 学习笔记之操作符
Jan 14 Javascript
详解Javascript数据类型的转换规则
Dec 12 Javascript
详解Vue.js 2.0 如何使用axios
Apr 21 Javascript
利用node.js如何搭建一个简易的即时响应服务器
May 28 Javascript
angularjs下拉框空白的解决办法
Jun 20 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
Jun 28 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
Jul 25 Javascript
vue展示dicom文件医疗系统的实现代码
Aug 27 Javascript
jQuery-ui插件sortable实现自由拖动排序
Dec 01 jQuery
JavaScript解析及序列化JSON的方法实例分析
Jan 04 Javascript
JSONP 的原理、理解 与 实例分析
May 16 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/12/14 PHP
PHP 柱状图实现代码
2009/12/04 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
分享下PHP register_globals 值为on与off的理解
2013/09/26 PHP
PHP简单检测网址是否能够正常打开的方法
2016/09/04 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
初学Javascript的一些总结
2008/11/03 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
JS冒泡事件的快速解决方法
2013/12/16 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
javascript实现计算器功能
2020/03/30 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
[47:53]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#2COL VS Spirit
2016/03/02 DOTA
python批量修改文件名的实现代码
2014/09/01 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
2018/06/22 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
Python脚本完成post接口测试的实例
2018/12/17 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
pytorch构建多模型实例
2020/01/15 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
详解python metaclass(元类)
2020/08/13 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
预备党员思想汇报范文
2013/12/29 职场文书
求职简历的自我评价
2014/01/31 职场文书
图解上海144收音机
2021/04/22 无线电
windows系统安装配置nginx环境
2022/06/28 Servers