2015-09-22 2 views
4

Есть уже некоторые вопросы о карте и слабых картах, например: What's the difference between ES6 Map and WeakMap?, но я хотел бы спросить, в какой ситуации я должен использовать эти структуры данных? Или что я должен принимать во внимание, когда я выступаю за других?ES6 Set, WeakSet, Map и 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;

+5

* «Бонус» * Спросите ** один ** вопрос на вопрос. –

+0

[Релевантный вопрос] (http://stackoverflow.com/questions/15604168/whats-the-difference-between-es6-map-and-weakmap) только на Картах. В частности, пример IIFE – CodingIntrigue

+1

Связанный: [Что такое фактическое использование ES6 WeakMap?] (Http://stackoverflow.com/q/29413222/218196) –

ответ

8

Это описано в §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 (имя свойства) будет проводиться сильная ссылка в объекте (его и связанное с ним свойство не будут исправлены, если ничего не ссылается на него).

Смежные вопросы