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中正则表达式的全局匹配模式分析
Apr 26 Javascript
Bootstrap每天必学之前端开发框架
Nov 19 Javascript
javascript实现2016新年版日历
Jan 25 Javascript
利用纯Vue.js构建Bootstrap组件
Nov 03 Javascript
三种方式实现瀑布流布局
Feb 10 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
May 01 jQuery
Vue学习笔记进阶篇之vue-router安装及使用方法
Jul 19 Javascript
vue中锚点的三种方法
Jul 06 Javascript
vue项目每30秒刷新1次接口的实现方法
Dec 04 Javascript
vue 强制组件重新渲染(重置)的两种方案
Oct 29 Javascript
vue+element导航栏高亮显示的解决方式
Nov 12 Javascript
JavaScript缺少insertAfter解决方案
Jul 03 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 setTime 设置当前时间的代码
2012/08/27 PHP
PHP添加Xdebug扩展的方法
2014/02/12 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
JS中判断null、undefined与NaN的方法
2014/03/24 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
简单谈谈js的数据类型
2017/09/25 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
Python中.py文件打包成exe可执行文件详解
2017/03/22 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
基于python的列表list和集合set操作
2019/11/24 Python
Pytorch环境搭建与基本语法
2020/06/03 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
解决pip install psycopg2出错问题
2020/07/09 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
基于PyTorch中view的用法说明
2021/03/03 Python
巴黎一票通:The Paris Pass
2018/02/10 全球购物
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
运动会解说词200字
2014/02/06 职场文书
学生安全责任书
2014/04/15 职场文书
租房协议书样本
2014/08/20 职场文书
《乙女游戏世界对路人角色很不友好》OP主题曲无字幕动画MV公开
2022/04/05 日漫
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers