资讯专栏INFORMATION COLUMN

ES6 - WeakSet

Jiavan / 1589人阅读

摘要:这几意味着,在初始化和调用的时候,都只能传入对象类型的元素。如果给方法传入非对象类型,会抛出错误。

在我们进入在WeakSet的使用之前,我们先来看一个用Set来存储对象引用的例子:

let set = new Set();
let key = {};
set.add(key);
key = null;
console.log(set.size); // 1
console.log([...set][0]); // {}

以上代码,我们存储了一个对象的引用key,但是随后我们通过key = null清楚了对象的引用,但是随后我们查看set.size依然得到1,且依然可以通过把set展开到数组取到原本已经被我们清除了引用的key。
之所以会出现这样的结果是因为,Set存储的是对象的强引用,虽然在代码的其他地方已经不存在对此变量的引用,但是javaScript的垃圾回收机制依然不会回收这段地址。这种情况,就会造成我们常说的内存泄漏

而WeakSet就是为了解决上面的问题而存在的,相比Set,WeakSet存的是对象的弱引用。意思就是,如果在代码的其他地方已经不存在任何引用,那么WeakSet也不会再保留这个引用,这样就可以被垃圾回收了。

了解了以上WeakSet的存在背景,现在就来看一下WeakSet的一些特性和使用:
一:初始化WeakSet
一:通过new WeakSet()初始化

let weakSet = new WeakSet();

二:传入可迭代对象初始化

let key1 = {};
let key2= {};
let weakSet = new WeakSet([key1, key2]);

二:WeakSet的add(),delete(),has()方法
区别于Set,WeakSet只有三个方法可用,分别是

1: add() 添加一个元素
2: delete() 删除一个元素
3: has() 查询某个元素是否存在

它们的功能和用法与Set所对应的三个方法一致,只是在参数类型上有所限制,即:
以上三个方法都不能传入基本数据类型,只能传入对象类型。 我们先来看一下代码示例:

let key1 = {name: "may"};
let key2= {name: "april"};

let weakSet = new WeakSet([key1, key2]);
console.log(weakSet.has(key1)); // true

weakSet.delete(key2);

let key3 = {name: "mike"};
let result = weakSet.add(key3);
console.log(result);

最后打印 console.log(result),我们得到结果:

WeakSet {{…}, {…}}
__proto__: WeakSet
[[Entries]]: Array(2)
0:
value: {name: "may"}
1:
value: {name: "mike"}
length: 2

可以看到因为调用delete(key2), 所以我们最后的结果里面没有了key2。

三:WeakSet与Set的区别

WeakSet与Set除了存储的分别是对象的弱引用和强引用之外,还有很多差别,下面我们就来总结一下WeakSet的特性:

1: WeakSet只能不能存储基本数据类型。这几意味着,在初始化和调用add()的时候,都只能传入对象类型的元素。
2: 如果给add()方法传入非对象类型,会抛出错误。给delete()和has()传入非对象类型参数,则总是返回false。
3: WeakSet不可迭代,所以所有迭代的场景都不能使用,例如for-of, 展开运算符等
4: WeakSet不暴露任何的迭代器,例如keys(),values(),这也是其不能被迭代的原因
5: WeakSet不支持forEach()方法
6: WeakSet不支持size属性

以上就是关于WeakSet的基本特性和功能。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106147.html

相关文章

  • es6基础0x013:WeakSet

    摘要:概述和差不多,但是有一些不同只能存储对象,不能存储任意值不可迭代是弱引用,也就是如果没有变量引用内的值,很容易被回收初始化因为只能存储对象,所以这里我想只能传入类似对象数组之类的东西对象数组添加判断是否已经有了删除弱引用特性后输出,可以看到 0x000 概述 WeakSet和Set差不多,但是有一些不同: WeakSet只能存储对象,不能存储任意值 WeakSet不可迭代 We...

    trigkit4 评论0 收藏0
  • 带你入门 JavaScript ES6 (五) 集合

    摘要:一概述集合是引入的新的内置对象类型,其特点同数学意义的集合,即集合内所有元素不重复元素唯一。数组集合对比数组和集合,数组可以加入重复数据,而集合的所有元素是唯一的不允许重复。因此,适合临时存放一组对象,以及存放跟对象绑定的信息。 本文同步带你入门 带你入门 JavaScript ES6 (五) 集合,转载请注明出处。 前面我们学习了: for of 变量和扩展语法 块作用域变量和解构...

    BetaRabbit 评论0 收藏0
  • es6 Set和WeakSet

    摘要:返回一个布尔值,表示该值是否为的成员。清除所有成员,没有返回值。上面代码中,方法返回的遍历器,同时包括键名和键值,所以每次输出一个数组,它的两个成员完全相等。因此,适合临时存放一组对象,以及存放跟对象绑定的信息。 Js大部分历史时期都只存在一种集合类型,也就是数组类型。数组在 JS 中的使用正如其他语言的数组一样,但缺少更多类型的集合导致数组也经常被当作队列与栈来使用。数组只使用了数值...

    marser 评论0 收藏0
  • 细说es6中的Set和Map

    摘要:返回一个布尔值,表示该值是否为的成员。返回键名的遍历器返回键值的遍历器返回键值对的遍历器使用回调函数遍历每个成员需要特别指出的是,的遍历顺序就是插入顺序。该数组的所有成员,都会自动成为实例对象的成员。这意味着,数组的成员只能是对象。 1.Set ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构...

    Ryan_Li 评论0 收藏0
  • 初探ES6中的Set和weakSet

    摘要:对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。不能重复获取的值方法用来向一个对象的末尾添加一个指定的值。 Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。(不能重复) const set1=new Set([1,2,3,4,5,6]); console.log(set1); //Set { 1, 2, 3, 4, 5, 6 } 获取set的值 cons...

    afishhhhh 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<