【ES6基础】Set 与 WeakSet

news/2024/7/20 12:58:20 标签: 前端, javascript, 内存管理


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

其实无序集合的概念十分容易理解,我们可以认为是没有排序概念的数组,并且具有元素不可重复的特性。

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

  • Set代码示例
  • Set和Array的区别
  • Set常用方法
  • WeakSet介绍

本篇文章阅读时间预计5分钟

Set代码示例

Set需要使用新语法new Set()声明,代码如下:

javascript">javascript copyable">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的区别

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

Set常用方法

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

方法介绍
set.add(value)添加元素到集合内
set.delete(value)删除元素的指定元素
set.clear()清空集合内元素
set.forEach(callbackFn,[,context])遍历集合内所有元素,并作为CallbackFn的参数进行调用
set.has(value)检查集合内是否含有某元素

添加删除清空

javascript">javascript copyable">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里使用了更简洁、更易懂的方法来检验是否含有某元素。

javascript">javascript copyable">const set=new Set([1,2,3,4]);
set.has(2) //output true;
set.has(5) //output false;
复制代码

遍历元素

集合对象自身定义了forEach方法,跟数组类型的foreach一样,示例代码如下:

javascript">javascript copyable">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对象是不可枚举的,也就是说无法获取大小,也无法获取其中包含的元素。

如下段的代码验证了上述特性:

javascript">javascript copyable">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
复制代码
javascript">javascript copyable">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。

【ES6基础】let和作用域

【ES6基础】const介绍

【ES6基础】默认参数值

【ES6基础】展开语法(Spread syntax)

【ES6基础】解构赋值(destructuring assignment)

【ES6基础】箭头函数(Arrow functions)

【ES6基础】模板字符串(Template String)

更多精彩内容,请微信关注”前端达人”公众号!



转载于:https://juejin.im/post/5cc18cd96fb9a032297b0200


http://www.niftyadmin.cn/n/1839040.html

相关文章

中国银联与上海银行基于SDN的下一代金融云网络联合研究与应用实践:从分层分区传统架构向云网架构转型...

本文作者: 上海银行 马永祥等 中国银联 祖立军等 0.引言 中国银联与上海银行就金融云与SDN技术研究等达成合作,其中中国银联的电子商务与电子支付国家工程实验室与上海银行数据中心以下一代金融云数据中心为蓝图,组成联合研究团队开展基于S…

福利|动动手指,20位技术大咖分享大会门票轻松到手

五一刚过,一大波福利已经席卷而来,还没反应过来的您,不用怀疑,这不是做梦。 现在只需动动手指,就可以获得一张由20多位分别来自Mesosphere、Rancher、阿里、京东、58同城、PPmoney、第四范式等顶级专家带来的技术分享&…

关于Netweaver 2005的架构平台说明

该图蓝色部分为abap平台下,黄色为java平台,绿色为客户端。 SAPNetWeaver的"usage types" 可以从应用部件角度来分类,如: Business Intelligence (BI) SAP NetWeaver Portal (EP) Mobile Infrastructure (MI) Process In…

一位数组续

设计并实现一个系统,让一个普通用户就能通过单步执行的方式看到你的算法是如何工作的。 1.1用户也可以自行定义数组的大小 2.1按单步执行键,在GUI看到你的程序是如何一步一步算出目前最大子数组的范围,当前计算到的临时子数组是在哪里&#x…

射雕里的丘处机,与五绝的差距究竟有多大?

作者|康翔编辑|阿冒 设计|沐由2018年末,照例在美国拉斯维加斯参加一年一度亚马逊云科技 re:Invent全球大会的我,居然在现场邂逅了一位国内的老熟人H君——如此的几率和缘分,是不是妙不可言?且…

聚焦大规模分布式机器学习,全面剖析Google TensorFlow,来看阿里、京东等在人工智能技术的进展...

在5月18日的北京 朝阳门悠唐皇冠假日酒店举办的CCTC 2017人工智能专场上,来自阿里、京东、IBM、PPmoney、第四范式的五位人工智能研究资深专家将为与会者带来顶级技术分享会,从曝光的议题看,技术含量极高。 具体来看,来自阿里巴巴…

洛谷p1208 水题贪心 思想入门

题目描述 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助Marry乳业找到最优的牛奶采购方案。 Marry乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是不同的。此外,就像…

Serverless,后端小程序的未来

作者简介:张鑫,ZStack创始人,于2006年加入Intel开源软件技术中心,从事Xen虚拟机开发,是世界上最早一批虚拟化开发者。《系统虚拟化》一书的主要作者。2010年,张鑫赴硅谷加入IaaS初创公司Cloud.com,是CloudS…