Это описано в §23.3 спецификации:
Если объект, который используется в качестве ключа в WeakMap
ключа/value достижима только по цепочке ссылок, которая начинается с этого WeakMap
, тогда эта пара ключей/значений недоступна и автоматически удаляется из WeakMap
.
Так записи в слабой карте, если их ключи не ссылаются все остальное, будет утилизирован в процессе сборки мусора в какой-то момент.
В противоположности этому, Map
держит сильного ссылку на его ключи, предотвращая их от сборщика мусора, если карта является единственной ссылкой на них.
MDN puts it like this:
Ключ в WeakMap
слабо проводятся. Это означает, что если нет других сильных ссылок на ключ, то вся запись будет удалена из WeakMap
сборщиком мусора.
И WeakSet
делает то же самое.
... в какой ситуации я должен одобрить использование этих структур данных?
Любая ситуация, когда вы не хотите, чтобы у вас была карта/набор, используя ключ, чтобы предотвратить сбор этого мусора.
Одним из примеров, когда вы могли бы использовать это будет иметь информацию, присущие, который был действительно частным к примеру, который выглядит следующим образом:
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
содержит только ссылки на, и поэтому, если ваш код с использованием экземпляра Thing
выполняется с ним и освобождает его ссылку на экземпляр, то WeakMap
не мешает экземпляру собирать мусор; вместо этого запись, введенная с помощью экземпляра, удаляется с карты.
Какие из перечисленных структур данных приведет к тому же/аналогичный результат делает: let hash = Object.create(null); hash[index] = something;
Это будет ближе всего к Map
, потому что строка index
(имя свойства) будет проводиться сильная ссылка в объекте (его и связанное с ним свойство не будут исправлены, если ничего не ссылается на него).
* «Бонус» * Спросите ** один ** вопрос на вопрос. –
[Релевантный вопрос] (http://stackoverflow.com/questions/15604168/whats-the-difference-between-es6-map-and-weakmap) только на Картах. В частности, пример IIFE – CodingIntrigue
Связанный: [Что такое фактическое использование ES6 WeakMap?] (Http://stackoverflow.com/q/29413222/218196) –