JavaScript学习数据结构ES6-WeakSet

293 阅读3分钟

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

前言:

回顾前文对 JS 中的重要数据结构 JSON & Set 的理解/使用处理后数据进行交互, JSON是经常打交道的用到的也比较多. 本文来记录学习另外一种数据结构: WeakSet

在前面系列更文中, 我们对 JavaScript 的一些知识点进行了一些列的学习, 也有通过 JS 实现经典算法作具体学习, 小总结更多阅读-list & 经典排序算法-list

JavaScript 数据结构

ES6 新增数据结构: WeakSet 和 上文学的 **Set**结构类似, 也是不重复值的集合.

但是两者还是有区别的:

  1. WeakSet 的成员只能是对象, 而不能是其他类型的值

  2. WeakSet 中的对象都是弱引用

    垃圾回收机制不考虑 WeakSet 对该对象的引用. 理解: 如果其他对象都不再引用该对象, 那么即使该对象还存在于 WeakSet 之中, 垃圾回收机制会自动回收该对象所占用的内存

WeakSet()

WeakSet | MDN WeakSet 对象允许你将弱保持对象存储在一个集合中。

WeakSet() 也是一个构造函数. 通过 new 一个 来初始化一个 WeakSet 数据结构

let ws = new WeakSet();

WeakSet 语法:

 new WeakSet([iterable]);

WeakSet 作为构造函数, 可以接受一个数组或类似数组的对象作为参数。(实际上, 任何具有 Iterable 接口的对象也是都可以作为 WeakSet 的参数)该数组的所有成员, 都会自动成为 WeakSet 实例对象的成员。 注意 null 被认为是 undefined

let arrarr = [[1, 2], [3, 4]];
let ws = new WeakSet(arrarr);
// WeakSet {[1, 2], [3, 4]}

上面的例子 arrarr 数组的元素是对象

而下面的例子数组 arr 的成员不是对象, 加入 WeakSet 就会报错。

let arr = [3, 4];
let ws = new WeakSet(arr);
// Uncaught TypeError: Invalid value used in weak set(…)

WeakSet 没有办法遍历它的成员, 因为它也没有size属性

WeakSet 结构的三个方法:

  • WeakSet.prototype.add(value): 向 WeakSet 实例添加一个新成员
  • WeakSet.prototype.delete(value): 清除 WeakSet 实例的指定成员
  • WeakSet.prototype.has(value): 返回一个布尔值, 表示某个值是否在 WeakSet 实例之中
let ws = new WeakSet();
let obj = {};
let foo = {};

ws.add(window);
ws.add(obj);

ws.has(window); // true
ws.has(foo);    // false

ws.delete(window);
ws.has(window);    // false

更多阅读:

经典排序算法:

JavaScript 学习提升