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与iframe的那些事儿
Jul 04 Javascript
jquery阻止后续事件只执行第一个事件
Jul 24 Javascript
javascript插件开发的一些感想和心得
Feb 28 Javascript
vue分类筛选filter方法简单实例
Mar 30 Javascript
ES6正则表达式的一些新功能总结
May 09 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
Jul 12 Javascript
纯JavaScript实现实时反馈系统时间
Oct 26 Javascript
详解VueJs中的V-bind指令
May 03 Javascript
vue.js实现带日期星期的数字时钟功能示例
Aug 28 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
Dec 22 Javascript
JavaScript页面加载事件实例讲解
Sep 01 Javascript
Vue实现商品详情页的评价列表功能
Sep 04 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编写大型网站问题集
2007/03/06 PHP
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
php实现的SESSION类
2014/12/02 PHP
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
jQuery+ajax中getJSON() 用法实例
2014/12/22 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
Javascript刷新页面的实例
2017/09/23 Javascript
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
Node 使用express-http-proxy 做api网关的实现
2020/10/15 Javascript
python多线程http下载实现示例
2013/12/30 Python
python3.5 tkinter实现页面跳转
2018/01/30 Python
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
python之语音识别speech模块
2020/09/09 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
请说出你所知道的线程同步的方法
2013/04/19 面试题
大学生全国两会报告感想
2014/03/17 职场文书
2014年残疾人工作总结
2014/12/06 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
决心书格式范文
2015/09/23 职场文书
springboot中的pom文件 project报错问题
2022/01/18 Java/Android
详细聊聊Oracle表碎片对性能有多大的影响
2022/03/19 Oracle