【ES6基础】Set 与 WeakSet
栏目: JavaScript · 发布时间: 5年前
内容简介:在开发过程中,我们会经常使用到数组Array这种引用类型的数据结构,并十分清楚数组是种有序的集合,并且每个元素都可以使用数字下标的形式获取。但是在一些业务场景中,我们并不需要集合维护一个有序的状态,甚至有些场景需要无序集合,因此ES6里加入了无序集合Set和其的Weak版本WeakSet。其实无序集合的概念十分容易理解,我们可以认为是没有排序概念的数组,并且具有元素不可重复的特性。
在开发过程中,我们会经常使用到数组Array这种引用类型的数据结构,并十分清楚数组是种有序的集合,并且每个元素都可以使用数字下标的形式获取。但是在一些业务场景中,我们并不需要集合维护一个有序的状态,甚至有些场景需要无序集合,因此ES6里加入了无序集合Set和其的Weak版本WeakSet。
其实无序集合的概念十分容易理解,我们可以认为是没有 排序 概念的数组,并且具有元素不可重复的特性。
这篇文章笔者将从以下几方面进行介绍:
- Set代码示例
- Set和Array的区别
- Set常用方法
- WeakSet介绍
本篇文章阅读时间预计5分钟
Set代码示例
Set需要使用新语法new Set()声明,代码如下:
let set = new Set("Hello!!!"); set.add(12); //add 12 console.log(set.has("!")); //check if value exists console.log(set.size); set.delete(12); //delete 12 console.log(...set); set.clear(); //delete all values”、 // 输出 0,1,2,3,4 复制代码
这段代码我们向Set集合里添加了一个字符串和数字,字符串在Set集合里会被拆分成字符进行存储,由于Set集合去重的特点,l和!重复将会被去重( Set { 'h', 'e', 'l', 'o' ,'!'}),使用add方法添加了12到Set集合里,因此集合的大小是6。
Set与Array的区别
以下表格为Array和Set的区别
对比项 | Array | Set |
---|---|---|
元素序列 | 有序 | 无序 |
元素可重复性 | 元素可重复 | 元素不可重复 |
Set常用方法
以下表格罗列了Set相关的方法
方法 | 介绍 |
---|---|
set.add(value) | 添加元素到集合内 |
set.delete(value) | 删除元素的指定元素 |
set.clear() | 清空集合内元素 |
set.forEach(callbackFn,[,context]) | 遍历集合内所有元素,并作为CallbackFn的参数进行调用 |
set.has(value) | 检查集合内是否含有某元素 |
添加删除清空
const set=new Set(); set .add(1) .add(2) .add(3) .add(3);//不起作用,因为3已经在集合中 console.log(set);//output Set { 1, 2, 3 } //删除元素 set.delete(2); console.log(set);//output Set {1,3} //清空集合 set.clear(); console.log(set); //output Set{} 复制代码
检查元素
因为Set集合里没有排序的概念,因此我们无法使用Array的IndexOf的方法判断是否大于0来检验是否含有某元素,ES6里使用了更简洁、更易懂的方法来检验是否含有某元素。
const set=new Set([1,2,3,4]); set.has(2) //output true; set.has(5) //output false; 复制代码
遍历元素
集合对象自身定义了forEach方法,跟数组类型的foreach一样,示例代码如下:
const set=new Set([1,2,3,4]); set.forEach(item=>{ console.log(item); }) //output //1 //2 //3 //4 复制代码
WeakSet介绍
JavaScript垃圾回收是一种内存管理技术。在这种技术中,不再被引用的对象会被自动删除,而与其相关的资源也会被一同回收。Set中对象的引用都是强类型化的,并不会允许垃圾回收。这样一来,如果Set中引用了不再需要的大型对象,如已经从DOM树中删除的DOM元素,那么其回收代价是昂贵的。
为了解决这个问题,ES6还引入了WeakSet的弱集合。这些集合之所以是“弱的”,是因为它们允许从内存中清除不再需要的被这些集合所引用的对象。
首先让我们了解下WeakSet与Set的不同,以下三点是WeakSet与Set不一样的地方:
- Set可以存储值类型和对象引用类型,而WeakSet只能存储对象引用类型,否则会抛出TypeError。
- WeakSet不能包含无引用的对象,否则会被自动清除出集合(垃圾回收机制)。
- WeakSet对象是不可枚举的,也就是说无法获取大小,也无法获取其中包含的元素。
如下段的代码验证了上述特性:
let weakset = new WeakSet(); (function(){ let a = {}; weakset.add(1); //TypeError: Invalid value used in weak set weakset.add(a); })(); //here 'a' is garbage collected from weakset console.log() console.log(weakset.size); //output "undefined" console.log(...weakset); //Exception is thrown weakset.clear(); //Exception, no such function 复制代码
const weakset=new WeakSet(); let foo={bar:1}; weakset.add(foo); console.log(weakset.has(foo)); //output true foo=null; console.log(weakset.has(foo)); //output false 复制代码
小节
今天的内容就介绍到这里,在今后的业务中,我们除了可以使用数组Array,还可以使用Set和WeakSet。 如果不涉及排序去重的场景,我们可以尝试使用set,如果你想优化程序内容的使用,你可以尝试使用WeakSet。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
CSS 压缩/解压工具
在线压缩/解压 CSS 代码
正则表达式在线测试
正则表达式在线测试