js中的WeakMap

文章类型:ES6

发布者:admin

发布时间:2023-04-05

weakMap是ES6引入的一种新的集合类型,是一种弱引用的映射表。它的功能类似于Map,但有一些不同之处。

一:定义

1:与Map不同,WeakMap的键只能是对象,不能是原始类型(如字符串、数字等)。这是因为WeakMap使用弱引用来存储键。

如果一个对象作为WeakMap的键,并且没有其他引用指向该对象,那么该对象将被垃圾回收。

这使得WeakMap非常适合于存储私有数据,因为一旦对象被销毁,与之关联的数据也会被自动删除。

2:它没有forEach()方法,也不能被迭代。这是因为WeakMap的键可能随时被垃圾回收,因此无法保证WeakMap的完整性。

它只提供了get()、set()、has()和delete()等基本方法来管理和访问集合中的数据。

二:作用

1:防止内存泄露,WeakMap的key只能是对象,不能是基本类型

三:使用场景

1:想临时记录数据或关系

2:vue3中大量使用了WeakMap

四:代码

const privateData = new WeakMap();

class MyClass {
constructor() {
privateData.set(this, { x: 0, y: 0 });
}

get x() {
return privateData.get(this).x;
}

set x(value) {
privateData.get(this).x = value;
}

get y() {
return privateData.get(this).y;
}

set y(value) {
privateData.get(this).y = value;
}
}

使用WeakMap来存储MyClass实例的私有数据。

在构造函数中,我们使用this作为WeakMap的键,并将一个包含x和y属性的对象作为值存储在其中。

我们使用get()和set()方法来访问和修改私有数据。

由于privateData是WeakMap,当MyClass实例被销毁时,与之关联的私有数据也将被自动删除。