gpt4 book ai didi

javascript - ES6 集合、WeakSet、Map 和 WeakMap

转载 作者:数据小太阳 更新时间:2023-10-29 05:51:54 24 4
gpt4 key购买 nike

已经有一些关于 map 和弱 map 的问题,像这样:What's the difference between ES6 Map and WeakMap?但我想问一下在什么情况下我应该赞成使用这些数据结构?或者当我偏爱其中一个时我应该考虑什么?

数据结构示例来自:https://github.com/lukehoban/es6features

// Sets
var s = new Set();
s.add("hello").add("goodbye").add("hello");
s.size === 2;
s.has("hello") === true;

// Maps
var m = new Map();
m.set("hello", 42);
m.set(s, 34);
m.get(s) == 34;

// Weak Maps
var wm = new WeakMap();
wm.set(s, { extra: 42 });
wm.size === undefined

// Weak Sets
var ws = new WeakSet();
ws.add({ data: 42 });
// Because the added object has no other references, it will not be held in the set

奖金。以上哪些数据结构会产生相同/相似的结果: let hash = object.create(null); hash[index] = something;

最佳答案

这包含在 §23.3 中规范:

If an object that is being used as the key of a WeakMap key/value pair is only reachable by following a chain of references that start within that WeakMap, then that key/value pair is inaccessible and is automatically removed from the WeakMap.

所以弱映射中的条目,如果它们的键没有被其他任何东西引用,将在某个时候被垃圾收集回收。

相比之下,Map 持有对其键的引用,如果 map 是唯一引用它们的对象,则可以防止它们被垃圾回收。

MDN puts it like this :

The key in a WeakMap is held weakly. What this means is that, if there are no other strong references to the key, then the entire entry will be removed from the WeakMap by the garbage collector.

WeakSet 也是如此。

...in which situation should I favor the use of this data structures?

任何你不希望你有一个使用键的映射/集合的情况,以防止该键被垃圾收集。以下是一些示例:

  1. 拥有对实例真正私有(private)的特定于实例的信息,如下所示:(注意:此示例来自 2015 年,远早于 private fields 是一个选项。在 2021 年,我会为此使用私有(private)字段。)

    let Thing = (() => {
    var privateData = new WeakMap();

    class Thing {
    constructor() {
    privateData[this] = {
    foo: "some value"
    };
    }

    doSomething() {
    console.log(privateData[this].foo);
    }
    }

    return Thing;
    })();

    作用域函数之外的代码无法访问 privateData 中的数据。该数据由实例本身键入。如果没有 WeakMap,您将不会这样做,因为这会导致内存泄漏,您的 Thing 实例将永远不会被清理。但是 WeakMap 只包含 weak 引用,因此如果您使用 Thing 实例的代码完成了它并释放了它对该实例的引用, WeakMap 不会阻止实例被垃圾回收;相反,实例键入的条目将从映射中删除。

  2. 持有您无法控制的对象的信息。假设您从某个 API 获得了一个对象,您需要记住有关该对象的一些附加信息。您可以向对象本身添加属性(如果它不是密封的),但是向您控制之外的对象添加属性只是自找麻烦。相反,您可以使用以对象为键的 WeakMap 来存储您的额外信息。

  3. WeakSet 的一个用例是跟踪或标记:假设在“使用”一个对象之前,您需要知道该对象过去是否曾经被“使用过”,但是不将其存储为对象上的标志(也许是因为如果它是对象上的标志,其他代码可以看到它[尽管您可以使用私有(private)字段来防止这种情况];或者因为它不是您的对象[所以私有(private)字段不会'帮助])。例如,这可能是某种一次性访问 token 。 WeakSet 是一种无需强制对象保留在内存中的简单方法。

Which of the above data structures will produce the same/similar result of doing: let hash = Object.create(null); hash[index] = something;

这将最接近 Map,因为字符串 index(属性名称)将由对象中的强引用持有(它及其关联的属性将如果没有其他引用它,则不会被回收)。

关于javascript - ES6 集合、WeakSet、Map 和 WeakMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32710432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com