ES6躬行记(16)——Set
ES6引入了两种新的数据结构:Set和Map。Set是一组值的集合,其中值不能重复;Map(也叫字典)是一组键值对的集合,其中键不能重复。Set和Map都由哈希表(Hash Table)实现,并可按添加时候的顺序枚举。
一、Set
Set类似于Array(数组),但需要通过SameValueZero算法保持值的唯一性。在前面的第11篇中,曾讲到Object.is()依据的比较算法是SameValue,SameValueZero算法与之类似,唯一的区别就是在该算法中,+0和-0是相等的。
1)创建
要使用Set,需要先将其实例化,如下代码所示,其中构造函数Set()能接收一个可选的参数:可迭代对象,例如字符串、数组等。
new Set(); //Set(0) {}
new Set("abc"); //Set(3) {"a", "b", "c"}
new Set([+0, -0, NaN, NaN]); //Set(2) {0, NaN}
2)写入
通过add()方法可以在Set的末尾添加一个任意类型的值,并且由于方法的返回值是当前的Set,因此可以采用链式的写法。再利用size属性就可得到成员数量,从而获悉是否添加成功,如下所示。
var set = new Set();
set.add(1).add("a"); //Set(2) {1, "a"}
set.size; //
有一点需要注意,虽然Set有写入方法,但并没有对应的读取方法。
3)移除
总共有两个移除的方法,分别是delete()和clear()。delete()可指定移除的值,而clear()能清空集合,即移除所有成员。下面承接写入中的示例,分别调用这两个移除方法,并在其之后会根据has()方法判断是否移除成功。
set.delete(1); //Set(1) {"a"}
set.has(1); //false
set.has("a"); //true set.clear(); //Set(0) {}
set.has(1); //false
set.has("a"); //false
4)遍历
Set与数组一样,也有三个ES6新增的迭代器方法:keys()、values()和entries(),功能也相同。但由于Set没有键,只有值,因此keys()和values()返回的结果是相同的,如下所示。
var digits = new Set();
digits.add(3).add(2).add(1);
[...digits.keys()]; //[3, 2, 1]
[...digits.values()]; //[3, 2, 1]
[...digits.entries()]; //[[3, 3], [2, 2], [1, 1]]
除此之外,Set也有一个迭代方法:forEach(),参数也与数组的类似,第一个是回调函数,第二个是执行回调函数时使用的this对象。其中回调函数也包含3个参数,但参数含义略有不同,第一个和第二个都是当前成员的值,第三个是原始Set。从下面代码的注释中可知,Set的枚举顺序只与添加顺序有关,没有按照ES6所规定的枚举顺序(可参考第11篇)。
/*
3 3 Set(3) {3, 2, 1}
2 2 Set(3) {3, 2, 1}
1 1 Set(3) {3, 2, 1}
*/
digits.forEach(function(value1, value2, set) {
console.log(value1, value2, set);
});
5)转换
如果要将Set转换成数组,那么可以用Array.from()方法或扩展运算符实现,具体如下代码所示。注意,数组中的重复元素在传给Set后,就被过滤掉了。
var duplicate = new Set([1, 1, {}, undefined]);
Array.from(duplicate); //[1, {}, undefined]
[...duplicate]; //[1, {}, undefined]
二、WeakSet
WeakSet相对于Set,虽然只多了一个单词Weak(弱),但两者在很多方面都表现出了差异,具体如下所列:
(1)WeakSet中的值必须是对象,像数字、字符串或Symbol等其它类型都是不允许的。
(2)WeakSet中的对象都是弱引用,当没有变量或属性引用该对象时,将会被GC(Garbage Collection)自动回收掉。
(3)不可枚举WeakSet中的对象,即WeakSet不包含forEach()、keys()、values()和entries()方法。
(4)无法获取WeakSet中的成员数量,即没有size属性。
WeakSet的创建、写入和移除,与Set类似,具体如下所示。
var weak = new WeakSet(),
arr = [1];
weak.add(arr); //WeakSet {[1]}
weak.has(arr); //true
weak.delete(arr);
weak.has(arr); //false
目前,挖掘出的WeakSet用例并不多,比较经典的是用来存储DOM节点,当该节点从文档中被移除后,不必再担心引发内存泄露。
ES6躬行记(16)——Set的更多相关文章
- ES6躬行记(1)——let和const
古语云:“纸上得来终觉浅,绝知此事要躬行”.的确,不管看了多少本书,如果自己不实践,那么就很难领会其中的精髓.自己研读过许多ES6相关的书籍和资料,平时工作中也会用到,但在用到时经常需要上搜索引擎中查 ...
- ES6躬行记 笔记
ES6躬行记(18)--迭代器 要实现以下接口## next() ,return,throw 可以用for-of保证迭代对象的正确性 例如 var str = "向
- ES6躬行记(13)——类型化数组
类型化数组(Typed Array)是一种处理二进制数据的特殊数组,它可像C语言那样直接操纵字节,不过得先用ArrayBuffer对象创建数组缓冲区(Array Buffer),再映射到指定格式的视图 ...
- ES6躬行记(21)——类的继承
ES6的继承依然是基于原型的继承,但语法更为简洁清晰.通过一个extends关键字,就能描述两个类之间的继承关系(如下代码所示),在此关键字之前的Man是子类(即派生类),而在其之后的People是父 ...
- ES6躬行记(3)——解构
解构(destructuring)是一种赋值语法,可从数组中提取元素或从对象中提取属性,将其值赋给对应的变量或另一个对象的属性.解构地目的是简化提取数据的过程,增强代码的可读性.有两种解构语法,分别是 ...
- ES6躬行记(9)——字符串
在介绍字符串之前,有必要先了解一点Unicode的基础知识,有助于理解ES6提供的新功能和新特性. 一.Unicode Unicode是一种字符集(即多个字符的集合),它的目标是涵盖世界上的所有字符, ...
- ES6躬行记(7)——代码模块化
在ES6之前,由于ECMAScript不具备模块化管理的能力,因此往往需要借助第三方类库(例如遵守AMD规范的RequireJS或遵循CMD规范的SeaJS等)才能实现模块加载.而自从ES6引入了模块 ...
- ES6躬行记(4)——模板字面量
模板字面量(Template Literal)是一种能够嵌入表达式的格式化字符串,有别于普通字符串,它使用反引号(`)包裹字符序列,而不是双引号或单引号.模板字面量包含特定形式的占位符(${expre ...
- ES6躬行记(15)——箭头函数和尾调用优化
一.箭头函数 箭头函数(Arrow Function)是ES6提供的一个很实用的新功能,与普通函数相比,不但在语法上更为简洁,而且在使用时也有更多注意点,下面列出了其中的三点: (1)由于不能作为构造 ...
随机推荐
- Hive中的Order by与关系型数据库中的order by语句的异同点
在Hive中,ORDER BY语句是对查询结果集进行整体的排序,最终将会产生一个reducer进行全局的排序,达到的最终结果是和传统的关系型数据库是一样的. 在数据量非常大的时候,全局排序的单个red ...
- 【自动化测试】robotframework中一些建议可能需要掌握的关键字
这是2019年的第一篇文章,因公司事情较多,导致更新缓慢.这次主要推荐一些可能在使用rf工具的时候需要掌握的关键字. 1. @{cloose_ele} get webelements xpath= ...
- MUI消息推送
一.push通过H5+实现 简单实现方式:通过轮询服务器是否有新消息推送过来 mui.plusReady(function() { plus.navigator.closeSplashscreen() ...
- [bzoj1059]矩阵游戏
虽然是一道水难题,但是我这种蒟蒻还是要讲一讲的. Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N *N黑白方阵进行(如同国际 ...
- [LeetCode] Longest Mountain in Array 数组中最长的山
Let's call any (contiguous) subarray B (of A) a mountain if the following properties hold: B.length ...
- CVE-2018-20129:DedeCMS V5.7 SP2前台文件上传漏洞
一.漏洞摘要 漏洞名称: DedeCMS V5.7 SP2前台文件上传漏洞上报日期: 2018-12-11漏洞发现者: 陈灿华产品首页: http://www.dedecms.com/软件链接: ht ...
- angular.js学习笔记(二)
1.安装core ,shared模块 ng g m core ng g m shared 2.在shared中导入core模块 core模块只加载一次所以将公共组件放到core中 3.创建公共组 ...
- 请输入一个大于7的整数,输出小于k并且至少满足下面2个条件中的1个条件的所有正整数
import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 22:06 * @description ...
- DCOS实践分享(3):基于Mesos 和 Docker企业级移动应用实践分享
2016年1月24日 8:00—19:00 北京万豪酒店(东城区建国门南大街7号) @Container大会是由国内容器社区DockOne组织的专为一线开发者和运维工程师设计的顶级容器技术会议,会议强 ...
- Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)
ASP.NET Core知多少系列:总体介绍及目录 Demo路径:GitHub-RPL.Demo 1. Introduction Razor Page Library 是ASP.NET Core 2. ...