Previous Entry Share Next Entry
2016-01

JS, WeakMap, WeakReference и т.д.

Или я торможу, или лыжи не едут...

Вот бывают WeakReference, c ними всё понятно - их можно dereference, и в ответ дадут или value, или ничего, если GC уже добрался.

И бывают WeakValueDictionary, которые по сути Dictionary[String,WeakReference[Object]], с ними тоже всё понятно.

Но в JS есть WeakMap, в котором когда ключ!!! собрался, то удаляется value.

Внимание, вопрос: из них можно сделать WeakReference или нет? Если нет, то какой у них юзкейс вообще? о_О

(Я хочу сделать кэш, но там обьекты очень тяжелые, и когда кешей несколько - лучше пусть GC чистит, ему виднее)

This entry was originally posted at http://wizzard.dreamwidth.org/388512.html. It has comment count unavailable comments. Please comment there using OpenID.

  • 1
sassa_nf August 29th, 2014
По-моему, юз-кейс такой:

Хранишь себе WeakMap с "каноническими" строками в виде ключей. По проводам приходит ключ - находишь "значение". Например, у браузера только Session ID, а на сервере - всё остальное (хотя и не очень удачный пример, т.к. здесь таймаут более жёстко контроллируется)

mr_aleph August 29th, 2014
примитивы (строки, числа и тд) нельзя использовать в качестве ключей в WeakMap.

Edited at 2014-08-29 02:49 pm (UTC)

buriy August 29th, 2014
Ну, в твоей терминологии, WeakMap -- это Dictionary[WeakReference[Object], [Object]]
Если ты не используешь объекты как ключи, это тебе не нужно.
А если используешь -- то, наверное, чтобы хранить какую-то доп. информацию об объектах?
Представь jQuery , который хранит доп. данные для каждого узла DOM.
Если узел DOM удаляется, нам эти данные тоже теперь больше не нужны.

Прям как в анекдоте:
Прыгает чувак с парашютом.
Выпрыгнул, дергает кольцо - основной не раскрывается.
Дергает запасной парашют - не раскрывается.............
Достает нож, расстегивает ширинку и с криком "Ты мне больше нахуй не нужен!" отрезает свое хозяйство".
Вдруг открывается парашют, взмах ножом над головой - "Теперь и ты мне нахуй не нужен!!!!!!!!!!!"

wizzard0 August 30th, 2014
ну да, всё так. мне другое нужно...

mr_aleph August 29th, 2014
use case у них в основном это создание expando:

var storage = new WeakMap;
function getLibrarySpecificDataFor(obj) {
  var data = storage.get(obj);
  if (data === void 0) {
    data = new Data();
    storage.set(obj, data);
  }
  return data;
}


вместо

obj.щас_как_понапихаю_пропертей = 42;


WeakReference из них сделать очевидно нельзя --- и это специально так устроено было, потому что TC-39 долго сопротивлялись WR, поскольку они позволяют наблюдать GC, а они считают, что наблюдение GC - это опасный информационный side channel.

wizzard0 August 30th, 2014
ыгы, про сайдченнел я читал. жаль-жаль.

wizzard0 August 30th, 2014
ха, я таки смог часть моих нужд в кэшах выразить через expando, помогло!

  • 1
?

Log in

No account? Create an account