ÐоллекÑии
ÐÑÐ¾Ñ Ñаздел ÑодеÑÐ¶Ð¸Ñ Ð¾Ð±Ð·Ð¾Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑий Set и ÑловаÑей Map - вÑÑÑоеннÑÑ
ÑÑÑÑкÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
Ñ Ð´Ð¾ÑÑÑпом по клÑÑÑ.
СловаÑи
>Тип Map
Map - ÑеализаÑÐ¸Ñ Ð¿ÑоÑÑого аÑÑоÑиаÑивного маÑÑива (ÑловаÑÑ). Ðн ÑодеÑÐ¶Ð¸Ñ Ð´Ð°Ð½Ð½Ñе в виде набоÑа Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение(клÑÑи ÑникалÑнÑ) и пÑедоÑÑавлÑÐµÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа и манипÑлиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑими даннÑми.
Также как и обÑекÑ, ÑловаÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑеÑ
- полÑÑаÑÑ Ð·Ð½Ð°Ñение по клÑÑÑ, а Ñакже пÑовеÑÑÑÑ Ð½Ð°Ð»Ð¸Ñие клÑÑа
- добавлÑÑÑ/ÑдалÑÑÑ Ð¿Ð°ÑÑ ÐºÐ»ÑÑ/знаÑение
- пеÑезапиÑÑваÑÑ Ð·Ð½Ð°Ñение по клÑÑÑ (клÑÑи ÑникалÑнÑ).
- иÑеÑиÑоваÑÑÑÑ Ð¿Ð¾ клÑÑам
СловаÑи, как ÑпеÑиализиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑÑкÑÑÑа даннÑÑ , имеÑÑ ÑÑÑеÑÑвеннÑе пÑеимÑÑеÑÑва по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¾Ð±ÑекÑами:
- ÐлÑÑи ÑловаÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð»Ñбого Ñипа (а не ÑолÑко ÑÑÑоки).
- СловаÑÑ Ñ ÑÐ°Ð½Ð¸Ñ Ñвой ÑÐ°Ð·Ð¼ÐµÑ (не надо вÑÑиÑлÑÑÑ).
- ÐаÑÑÑалÑнÑй поÑÑдок обÑ
ода ÑлеменÑов ( в поÑÑдке добавлениÑ) Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
for...of. - СловаÑÑ Ð½Ðµ подмеÑÐ¸Ð²Ð°ÐµÑ ÐºÐ»ÑÑи из пÑоÑоÑипа (в оÑлиÑие Ð¾Ñ Ð¾Ð±ÑекÑа).
Ð ÑледÑÑÑем пÑимеÑе пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð¾ÑновнÑе опеÑаÑии Ñо ÑловаÑÑм:
var sayings = new Map();
sayings.set("dog", "woof");
sayings.set("cat", "meow").set("elephant", "toot");
//вÑзов ÑÑнкÑии .set возвÑаÑÐ°ÐµÑ Map, поÑÑÐ¾Ð¼Ñ set можно обÑединÑÑÑ Ð² ÑепоÑки
sayings.set("dog", "гав-гав"); // замениÑÑ Ð·Ð½Ð°Ñение по клÑÑÑ
sayings.size; // 3
sayings.get("fox"); // undefined
sayings.has("bird"); // false
sayings.delete("dog");
for (var [key, value] of sayings) {
console.log(key + " goes " + value);
}
// "cat goes meow"
// "elephant goes toot"
ÐолÑÑе пÑимеÑов и полное опиÑание на ÑÑÑаниÑе ÑпÑавоÑника Map .
Тип WeakMap
WeakMap ÑÑо ÑпеÑиалÑнÑй вид ÑловаÑÑ, клÑÑами коÑоÑого могÑÑ Ð±ÑÑÑ ÑолÑко обÑекÑÑ, пÑиÑÑм ÑÑÑлки на ниÑ
в WeakMap ÑвлÑÑÑÑÑ ÑлабÑми (не ÑÑиÑÑваÑÑÑÑ ÑбоÑÑиком мÑÑоÑа (garbage collector GC)).
ÐÑимеÑание:
ÐнÑеÑÑÐµÐ¹Ñ WeakMap ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Map, единÑÑвенное оÑлиÑие - клÑÑи WeakMap нелÑÐ·Ñ Ð¸ÑеÑиÑоваÑÑ (Ñ.e. нелÑÐ·Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑпиÑок клÑÑей). ÐÑо понÑÑно, поÑколÑÐºÑ Ð² Ñаком ÑлÑÑае возникла Ð±Ñ Ð½ÐµÐ¾Ð¿ÑеделÑнноÑÑÑ Ñ Ð´Ð¾ÑÑовеÑноÑÑÑÑ ÑÑого ÑпиÑка в завиÑимоÑÑи Ð¾Ñ ÑоÑÑоÑÐ½Ð¸Ñ garbage collection.
ÐолÑÑе пÑимеÑов, полное опиÑание, а Ñакже обÑÑждение "ÐаÑем WeakMap?" на ÑÑÑаниÑе ÑпÑавоÑника WeakMap.
ÐÑмеÑим, ÑÑо WeakMap, в ÑаÑÑноÑÑи, Ð¼Ð¾Ð¶ÐµÑ ÑлеганÑно иÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ñпаковки пÑиваÑнÑÑ
даннÑÑ
или деÑалей ÑеализаÑии. СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð²Ð·ÑÑ Ð¸Ð· ÑÑаÑÑи Ðика ФиÑÑджеÑалÑда «Hiding Implementation Details with ECMAScript 6 WeakMaps» (англ.). ÐÑиваÑÐ½Ð°Ñ ÑаÑÑÑ ÑоÑ
ÑанÑеÑÑÑ ÐºÐ°Ðº знаÑение в privates и Ð¸Ð¼ÐµÐµÑ Ð²ÑÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ Ñакое же как и ÑÑÑноÑÑÑ ÐºÐ»Ð°ÑÑа. Сам клаÑÑ Ð¸ его меÑÐ¾Ð´Ñ Ð¿ÑблиÑнÑ; пÑоÑее недоÑÑÑпно извне модÑлÑ:
const privates = new WeakMap();
export class Public() {
constructor() {
const me = {
// ÐÑиваÑнÑе даннÑе идÑÑ Ð·Ð´ÐµÑÑ
};
// 'me' бÑÐ´ÐµÑ Ð¾ÑвобождÑн вмеÑÑе Ñ 'this' !!!
privates.set(this, me);
}
method () {
const me = privates.get(this);
// СделайÑе ÑÑо-нибÑÐ´Ñ Ñ Ð¿ÑиваÑнÑми даннÑми в 'me'...
}
}
ÐоллекÑии
>Тип Set
Set ÑеализаÑÐ¸Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑии - ÑÑÑÑкÑÑÑа даннÑÑ
, коÑоÑÐ°Ñ ÑодеÑÐ¶Ð¸Ñ ÑпиÑок ÑникалÑнÑÑ
ÑлеменÑов в поÑÑдке иÑ
добавлениÑ.
Ð ÑледÑÑÑем пÑимеÑе пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð¾ÑновнÑе опеÑаÑии по ÑабоÑе Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑией Set:
var mySet = new Set();
mySet.add(1);
mySet.add("some text");
mySet.add("foo");
mySet.has(1); // true
mySet.delete("foo");
mySet.size; // 2
for (let item of mySet) console.log(item);
// 1
// "some text"
ÐолÑÑе пÑимеÑов и полное опиÑание на ÑÑÑаниÑе ÑпÑавоÑника Set
ÐÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Array и Set
Ðожно ÑоздаÑÑ Array из Set Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Array.from или иÑполÑзÑÑ spread operator.
Ð ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, конÑÑÑÑкÑÐ¾Ñ Set Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Array в каÑеÑÑве аÑгÑменÑа.
ÐÑимеÑание:
ÐоÑколÑÐºÑ Set ÑÑÑÑкÑÑÑа ÑабоÑÐ°ÐµÑ Ñ ÑникалÑнÑми знаÑениÑми, лÑбÑе повÑоÑÑÑÑиеÑÑ ÑлеменÑÑ Ð¸Ð· Array бÑдÑÑ Ð¿ÑоигноÑиÑованÑ.
Array.from(mySet);
[...mySet2];
mySet2 = new Set([1, 2, 3, 4]);
СÑавнение Array и Set
СловаÑи, как ÑпеÑиализиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑÑкÑÑÑа даннÑÑ , имеÑÑ ÑÑÑеÑÑвеннÑе оÑлиÑÐ¸Ñ Ð¿Ð¾ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¼Ð°ÑÑивами:
Set.hasÑабоÑÐ°ÐµÑ Ð±ÑÑÑÑее ÑемArray.indexOf.- можно ÑдалÑÑÑ ÑлеменÑÑ Ð¿Ð¾ знаÑÐµÐ½Ð¸Ñ (а не по индекÑÑ ÐºÐ°Ðº маÑÑÐ¸Ð²Ð°Ñ ).
NaNобÑабаÑÑваеÑÑÑ ÐºÐ¾ÑÑекÑно.- поддеÑживаеÑÑÑ ÑникалÑноÑÑÑ Ð·Ð½Ð°Ñений.
Тип WeakSet
WeakSet ÑÑо ÑпеÑиалÑнÑй вид коллекÑии, ÑлеменÑами коÑоÑой могÑÑ Ð±ÑÑÑ ÑолÑко обÑекÑÑ. СÑÑлки на ÑÑи обÑекÑÑ Ð² WeakSet ÑвлÑÑÑÑÑ ÑлабÑми (не ÑÑиÑÑваÑÑÑÑ ÑбоÑÑиком мÑÑоÑа (garbage collector GC)).
ÐÑимеÑание:
ÐлеменÑÑ WeakSet ÑникалÑÐ½Ñ Ð¸ могÑÑ Ð±ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ ÑолÑко один Ñаз, Ñакже как и в Set.
ÐÑновнÑе оÑлиÑÐ¸Ñ Ð¾Ñ Set:
WeakSetÑÑо коллекÑÐ¸Ñ Ð¾Ð±ÑекÑов ( пÑимиÑивнÑе знаÑÐµÐ½Ð¸Ñ Ð½Ðµ могÑÑ Ð±ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ).WeakSetнелÑÐ·Ñ Ð¸ÑеÑиÑоваÑÑ. Ð Ñакже нелÑÐ·Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑпиÑок (иÑеÑаÑоÑ) ÑлеменÑов.
ÐÑполÑзование WeakSet доÑÑаÑоÑно ÑпеÑиÑиÑеÑкое. ÐолÑзÑÑÑÑ Ñем, ÑÑо они не могÑÑ ÑоздаваÑÑ ÑÑеÑек памÑÑи, в ниÑ
можно, напÑимеÑ, безопаÑно помеÑаÑÑ ÑÑÑлки на DOM-ÑлеменÑÑ.
ÐолÑÑе пÑимеÑов и полное опиÑание на ÑÑÑаниÑе ÑпÑавоÑника WeakSet
ÐÑовеÑка на ÑавенÑÑво в Map и Set
СÑавнение на ÑавенÑÑво клÑÑей в Map objects или обÑекÑов в Set оÑновано на "same-value-zero algorithm":
- алгоÑиÑм ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð² Ñелом ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¾Ð¿ÐµÑаÑоÑом
===. -0и+0ÑÑиÑаÑÑÑÑ ÑавнÑми.NaNÑÑиÑаеÑÑÑ ÑавнÑм ÑÐ°Ð¼Ð¾Ð¼Ñ Ñебе (в оÑлиÑие оÑ===).