【ES6基础】Set 与 WeakSet

栏目: JavaScript · 发布时间: 6年前

内容简介:在开发过程中,我们会经常使用到数组Array这种引用类型的数据结构,并十分清楚数组是种有序的集合,并且每个元素都可以使用数字下标的形式获取。但是在一些业务场景中,我们并不需要集合维护一个有序的状态,甚至有些场景需要无序集合,因此ES6里加入了无序集合Set和其的Weak版本WeakSet。其实无序集合的概念十分容易理解,我们可以认为是没有排序概念的数组,并且具有元素不可重复的特性。

【ES6基础】Set 与 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不一样的地方:

  1. Set可以存储值类型和对象引用类型,而WeakSet只能存储对象引用类型,否则会抛出TypeError。
  2. WeakSet不能包含无引用的对象,否则会被自动清除出集合(垃圾回收机制)。
  3. 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。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Design for Hackers

Design for Hackers

David Kadavy / Wiley / 2011-10-18 / USD 39.99

Discover the techniques behind beautiful design?by deconstructing designs to understand them The term ?hacker? has been redefined to consist of anyone who has an insatiable curiosity as to how thin......一起来看看 《Design for Hackers》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具