【ES6基础】Set 与 WeakSet


在开发过程当中,咱们会常常使用到数组Array这种引用类型的数据结构,并十分清楚数组是种有序的集合,而且每一个元素均可以使用数字下标的形式获取。可是在一些业务场景中,咱们并不须要集合维护一个有序的状态,甚至有些场景须要无序集合,所以ES6里加入了无序集合Set和其的Weak版本WeakSet。javascript

其实无序集合的概念十分容易理解,咱们能够认为是没有排序概念的数组,而且具备元素不可重复的特性。前端

这篇文章笔者将从如下几方面进行介绍:java

  • 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”
//output
//true
//6
//H e l o !复制代码

这段代码咱们向Set集合里添加了一个字符串和数字,字符串在Set集合里会被拆分红字符进行存储,因为Set集合去重的特色,l和!重复将会被去重( Set { 'h', 'e', 'l', 'o' ,'!'}),使用add方法添加了12到Set集合里,所以集合的大小是6。数据结构

Set与Array的区别

如下表格为Array和Set的区别函数

对比项 Array Set
元素序列 有序 无序
元素可重复性 元素可重复 元素不可重复

Set经常使用方法

如下表格罗列了Set相关的方法post

方法 介绍
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同样,示例代码以下:ui

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。

相关文章
相关标签/搜索