前言
小伙伴们大家好。前面一篇文章中我们已经分享了一个ES6中的数据结构Set,掌握了Set的一些特点和方法,相信对我们日后开发一定会有很大的帮助。接下来我们再来看es6中与Set非常类似的另外一个数据结构WeakSet。
WeakSet
WeakSet 数据结构与Set类似,也是不重复的值的集合,同时也是一个构造函数。但有2点不同:WeakSet的值必须都是对象并且WeakSet是不可遍历的。WeakSet的特点及用法如下:
- WeakSet也是一个构造函数,可以用new来创建WeakSet数据结构,同时WeakSet可以接收一个值为对象的数组(或者具有 iterable 接口的其他数据结构)作为参数用来初始化WeakSet
- WeakSet的值只能是对象类型,不能是其它类型(基本数据类型)
- WeakSet没有size属性,不能被遍历
- WeakSet中的值也是不能重复的,跟Set一样WeakSet中两个对象永远是不相等的,即使键和值都是一样的
- WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。
// 1. WeakSet也是一个构造函数,可以用new来创建WeakSet数据结构
// 2. WeakSet可以接收一个值为对象的数组(或者具有 iterable 接口的其他数据结构)作为参数用来初始化WeakSet
let ws = new WeakSet([{"a":"b"},[1,2],function(){}]);
// 3. WeakSet的值只能是对象类型,不能是其它类型(基本数据类型)
let ws = new WeakSet([1,2,3]);
//结果:Uncaught TypeError: Invalid value used in weak set(…)
// 4. WeakSet没有size属性,不能被遍历
ws.size // undefined
ws.forEach // undefined
ws.forEach(function(item){ console.log(item)})
// TypeError: undefined is not a function
WeakSet 的方法
WeakSet 跟Set不同,它只提供了3个方法,因为WeakSet是不能遍历的因此对于Set中所有遍历的方法在WeakSet中都是不存在的。
- add(value)向 WeakSet 实例添加一个新成员,value必须是对象类型否则会报错,返回值也是一个WeakSet的实例
- delete(value)删除WeakSet中指定的成员,返回值为布尔类型,标识是否删除成功。
- has(value)检测WeakSet中是否存在指定的成员,返回值为布尔类型,标识成员是否存在。
WeakSet的使用场景
由于WeakSet中的对象都是弱引用,不会被垃圾回收机制所考虑这一特点,因此WeakSet可以用来储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏
总结
本文分享了关于WeakSet的一些用法和特点,并与之前学过Set做了简单的比较,最后根据WeakSet的特殊特点还总结了关于它的使用场景。
喜欢的小伙伴欢迎点赞留言加关注哦!