开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天
ES6新增的Set和WeakSet
在原先的JavaScript中,我们主要使用数组与对象进行数据存储,常常很羡慕Java python等语言开发者,但是ES6来啦,我们也扩充了自己的数据结构!
在ES6中新增了两种另外的数据结构:Set、Map,以及它们另外的形式WeakSet、WeakMap,本篇先为大家介绍Set和WeakSet。
Set
主要方法
构造方法
创建一个Set:
const arrSet = new Set()
同时也可以传入一个可迭代对象来生成Set:
const arrSet = new Set([1,2,3,3])
但Set不允许出现重复元素,最终只有一个3被存入,通过这种方式我们可以很简单地完成数组去重,最终只需要将其再次转换为数组:Array.from(arrSet)
add方法
add方法可为set中按序添加数据,返回set本身:
const set = new Set();
set.add(10);
set.add(20);
set.add(20);
set.add({});
set.add({});
注意:
- 之前提到过Set中不能存在重复的元素,例如上面我传入两个20,最终打印输出的set集合内只会有一个20。
- 但是两个空对象并不是一个元素,所以set集合内会存在=>{10, 20, {}, {}}
delete方法
删除set中的元素,返回布尔值
setName.delete(33);//删除setName集合中值为33的元素,删除成功则返回true
has方法
检查set中是否存在某一元素,返回布尔值
setName.has(33);//检查setName中是否存在值为33的元素,若存在则返回true
clear方法
清除set内所有元素
setName.clear();
forEach方法
遍历元素
setName.forEach(item => {console.log(item);});
主要属性
size
size属性记录了set中的数据个数,通过setName.size的方式调用
WeakSet
WeakSet是与Set类似的一种数据结构,内部元素同样不能重复
与Set的区别
- WeakSet中只能存放对象类型,不能存放基本数据类型
- WeakSet对元素的引用为弱引用,如果没有其他引用对某个对象进行引用,那么垃圾回收机制会将该对象进行回收
- WeakSet的主要方法与Set大致相同,但其不可遍历,因为WeakSet只是对对象的弱引用,如果我们遍历获取到其中的元素,那么有可能造成对象不能正常的销毁
也就是说,如下行为会报错:
const weakSet = new WeakSet();
weakSet.add(10);//若添加的数据不是对象就会报错
weakSet.forEach(item => {console.log(item);});
什么是弱引用呢?
let obj = {name:"何小幸"};
以上就是一个引用,或者可以叫做强引用,obj指向了{name:"何小幸"}对象,而如果令obj = null,则断开了对其的引用,一旦一个对象的引用数为0,就会被当作垃圾从而回收。
那么弱引用与强引用相对,其作为引用也指向对应的对象,但它的引用不会计入引用数,当一个对象没有强引用,只有弱引用存在,垃圾回收机制同样会将其判断为垃圾从而回收,WeakSet对其内的对象就为弱引用