Ð ES-2015 поÑвилиÑÑ Ð½Ð¾Ð²Ñе ÑÐ¸Ð¿Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑий в JavaScript: Set, Map, WeakSet и WeakMap.
Map
Map â коллекÑÐ¸Ñ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей вида клÑÑ:знаÑение.
РоÑлиÑие Ð¾Ñ Ð¾Ð±ÑекÑов, в коÑоÑÑÑ
клÑÑами могÑÑ Ð±ÑÑÑ ÑолÑко ÑÑÑоки, в Map клÑÑом Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑоизволÑное знаÑение, напÑимеÑ:
'use strict';
let map = new Map();
map.set('1', 'str1'); // клÑÑ-ÑÑÑока
map.set(1, 'num1'); // ÑиÑло
map.set(true, 'bool1'); // бÑлевое знаÑение
// в обÑÑном обÑекÑе ÑÑо бÑло Ð±Ñ Ð¾Ð´Ð½Ð¾ и Ñо же,
// map ÑоÑ
ÑанÑÐµÑ Ñип клÑÑа
alert( map.get(1) ); // 'num1'
alert( map.get('1') ); // 'str1'
alert( map.size ); // 3
Ðак видно из пÑимеÑа вÑÑе, Ð´Ð»Ñ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ ÑÑÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений иÑполÑзÑÑÑÑÑ Ð¼ÐµÑÐ¾Ð´Ñ get и set. РклÑÑи и знаÑÐµÐ½Ð¸Ñ ÑоÑ
ÑанÑÑÑÑÑ Â«ÐºÐ°Ðº еÑÑÑ», без пÑеобÑазований Ñипов.
СвойÑÑво map.size Ñ
ÑÐ°Ð½Ð¸Ñ Ð¾Ð±Ñее колиÑеÑÑво запиÑей в map.
ÐеÑод set можно ÑейниÑÑ:
map
.set('1', 'str1')
.set(1, 'num1')
.set(true, 'bool1');
ÐÑи Ñоздании Map можно ÑÑÐ°Ð·Ñ Ð¸Ð½Ð¸ÑиализиÑоваÑÑ ÑпиÑком знаÑений.
ÐбÑÐµÐºÑ map Ñ ÑÑÐµÐ¼Ñ ÐºÐ»ÑÑами, как и в пÑимеÑе вÑÑе:
let map = new Map([
['1', 'str1'],
[1, 'num1'],
[true, 'bool1']
]);
ÐÑгÑменÑом new Map должен бÑÑÑ Ð¸ÑеÑиÑÑемÑй обÑÐµÐºÑ (не обÑзаÑелÑно именно маÑÑив). Ðезде ÑÑÐ¸Ð½Ð°Ñ ÑипизаÑиÑ, макÑималÑÐ½Ð°Ñ Ð³Ð¸Ð±ÐºÐ¾ÑÑÑ.
РкаÑеÑÑве клÑÑей map можно иÑполÑзоваÑÑ Ð¸ обÑекÑÑ:
'use strict';
let user = { name: "ÐаÑÑ" };
// Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ полÑзоваÑÐµÐ»Ñ Ð±Ñдем Ñ
ÑаниÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво поÑеÑений
let visitsCountMap = new Map();
// обÑÐµÐºÑ user ÑвлÑеÑÑÑ ÐºÐ»ÑÑом в visitsCountMap
visitsCountMap.set(user, 123);
alert( visitsCountMap.get(user) ); // 123
ÐÑполÑзование обÑекÑов в каÑеÑÑве клÑÑей â как Ñаз ÑÐ¾Ñ ÑлÑÑай, когда Map Ñложно замениÑÑ Ð¾Ð±ÑÑнÑми обÑекÑами Object. ÐÐµÐ´Ñ Ð´Ð»Ñ Ð¾Ð±ÑÑнÑÑ
обÑекÑов клÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко ÑÑÑокой.
ÐÐ»Ñ Ð¿ÑовеÑки знаÑений на ÑквиваленÑноÑÑÑ Ð¸ÑполÑзÑеÑÑÑ Ð°Ð»Ð³Ð¾ÑиÑм SameValueZero. Ðн аналогиÑен ÑÑÑÐ¾Ð³Ð¾Ð¼Ñ ÑавенÑÑÐ²Ñ ===, оÑлиÑие â в Ñом, ÑÑо NaN ÑÑиÑаеÑÑÑ ÑавнÑм NaN. ÐоÑÑÐ¾Ð¼Ñ Ð·Ð½Ð°Ñение NaN Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзовано в каÑеÑÑве клÑÑа.
ÐÑÐ¾Ñ Ð°Ð»Ð³Ð¾ÑиÑм нелÑÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð¸Ð»Ð¸ задаваÑÑ ÑÐ²Ð¾Ñ ÑÑнкÑÐ¸Ñ ÑÑавнениÑ.
ÐеÑÐ¾Ð´Ñ Ð´Ð»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей:
map.delete(key)ÑдалÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ñ ÐºÐ»ÑÑомkey, возвÑаÑаеÑtrue, еÑли ÑÐ°ÐºÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð±Ñла, инаÑеfalse.map.clear()â ÑдалÑÐµÑ Ð²Ñе запиÑи, оÑиÑаеÑmap.
ÐÐ»Ñ Ð¿ÑовеÑки ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÑÑа:
map.has(key)â возвÑаÑаеÑtrue, еÑли клÑÑ ÐµÑÑÑ, инаÑеfalse.
ÐÑеÑаÑиÑ
ÐÐ»Ñ Ð¸ÑеÑаÑии по map иÑполÑзÑеÑÑÑ Ð¾Ð´Ð¸Ð½ из ÑÑÑÑ
меÑодов:
map.keys()â возвÑаÑÐ°ÐµÑ Ð¸ÑеÑиÑÑемÑй обÑÐµÐºÑ Ð´Ð»Ñ ÐºÐ»ÑÑей,map.values()â возвÑаÑÐ°ÐµÑ Ð¸ÑеÑиÑÑемÑй обÑÐµÐºÑ Ð´Ð»Ñ Ð·Ð½Ð°Ñений,map.entries()â возвÑаÑÐ°ÐµÑ Ð¸ÑеÑиÑÑемÑй обÑÐµÐºÑ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñей[клÑÑ, знаÑение], он иÑполÑзÑеÑÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð²for..of.
ÐапÑимеÑ:
'use strict';
let recipeMap = new Map([
['огÑÑÑов', '500 гÑ'],
['помидоÑов', '350 гÑ'],
['ÑмеÑанÑ', '50 гÑ']
]);
// Ñикл по клÑÑам
for(let fruit of recipeMap.keys()) {
alert(fruit); // огÑÑÑов, помидоÑов, ÑмеÑанÑ
}
// Ñикл по знаÑениÑм
for(let amount of recipeMap.values()) {
alert(amount); // 500 гÑ, 350 гÑ, 50 гÑ
}
// Ñикл по запиÑÑм [клÑÑ,знаÑение]
for(let entry of recipeMap) { // Ñо же ÑÑо и recipeMap.entries()
alert(entry); // огÑÑÑов,500 Ð³Ñ , и Ñ.д., маÑÑÐ¸Ð²Ñ Ð¿Ð¾ 2 знаÑениÑ
}
ÐеÑÐµÐ±Ð¾Ñ Ð¾ÑÑÑеÑÑвлÑеÑÑÑ Ð² поÑÑдке вÑÑавки. ÐбÑекÑÑ Map гаÑанÑиÑÑÑÑ ÑÑо, в оÑлиÑие Ð¾Ñ Ð¾Ð±ÑÑнÑÑ
обÑекÑов Object.
ÐÑоме Ñого, Ñ Map еÑÑÑ ÑÑандаÑÑнÑй меÑод forEach, аналогиÑнÑй вÑÑÑÐ¾ÐµÐ½Ð½Ð¾Ð¼Ñ Ð² маÑÑивÑ:
'use strict';
let recipeMap = new Map([
['огÑÑÑов', '500 гÑ'],
['помидоÑов', '350 гÑ'],
['ÑмеÑанÑ', '50 гÑ']
]);
recipeMap.forEach( (value, key, map) => {
alert(`${key}: ${value}`); // огÑÑÑов: 500 гÑ, и Ñ.д.
});
Set
Set â коллекÑÐ¸Ñ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва знаÑений, пÑиÑÑм каждое знаÑение Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑÑеÑаÑÑÑÑ Ð»Ð¸ÑÑ Ð¾Ð´Ð¸Ð½ Ñаз.
ÐапÑимеÑ, к нам пÑÐ¸Ñ Ð¾Ð´ÑÑ Ð¿Ð¾ÑеÑиÑели, и Ð¼Ñ Ñ Ð¾Ñели Ð±Ñ ÑÐ¾Ñ ÑанÑÑÑ Ð²ÑÐµÑ , кÑо пÑиÑÑл. ÐÑи ÑÑом повÑоÑнÑе визиÑÑ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑиводиÑÑ Ðº дÑбликаÑам, Ñо еÑÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ поÑеÑиÑÐµÐ»Ñ Ð½Ñжно «поÑÑиÑаÑÑ» Ñовно один Ñаз.
Set Ð´Ð»Ñ ÑÑого оÑлиÑно подÑ
одиÑ:
'use strict';
let set = new Set();
let vasya = {name: "ÐаÑÑ"};
let petya = {name: "ÐеÑÑ"};
let dasha = {name: "ÐаÑа"};
// поÑеÑениÑ, некоÑоÑÑе полÑзоваÑели заÑ
одÑÑ Ð¼Ð½Ð¾Ð³Ð¾ Ñаз
set.add(vasya);
set.add(petya);
set.add(dasha);
set.add(vasya);
set.add(petya);
// set ÑоÑ
ÑанÑÐµÑ ÑолÑко ÑникалÑнÑе знаÑениÑ
alert( set.size ); // 3
set.forEach( user => alert(user.name ) ); // ÐаÑÑ, ÐеÑÑ, ÐаÑа
РпÑимеÑе вÑÑе многокÑаÑнÑе Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ и Ñого же обÑекÑа в set не ÑоздаÑÑ Ð»Ð¸ÑниÑ
копий.
ÐлÑÑеÑнаÑива Set â ÑÑо маÑÑÐ¸Ð²Ñ Ñ Ð¿Ð¾Ð¸Ñком дÑбликаÑа пÑи каждом добавлении, но они гоÑаздо Ñ
Ñже по пÑоизводиÑелÑноÑÑи. Ðли можно иÑполÑзоваÑÑ Ð¾Ð±ÑÑнÑе обÑекÑÑ, где в каÑеÑÑве клÑÑа вÑÑÑÑÐ¿Ð°ÐµÑ ÐºÐ°ÐºÐ¾Ð¹-нибÑÐ´Ñ ÑникалÑнÑй иденÑиÑикаÑÐ¾Ñ Ð¿Ð¾ÑеÑиÑелÑ. Ðо ÑÑо менее Ñдобно, Ñем пÑоÑÑой и наглÑднÑй Set.
ÐÑновнÑе меÑодÑ:
set.add(item)â добавлÑÐµÑ Ð² коллекÑиÑitem, возвÑаÑаеÑset(ÑейниÑÑÑ).set.delete(item)â ÑдалÑеÑitemиз коллекÑии, возвÑаÑаеÑtrue, еÑли он Ñам бÑл, инаÑеfalse.set.has(item)â возвÑаÑаеÑtrue, еÑлиitemеÑÑÑ Ð² коллекÑии, инаÑеfalse.set.clear()â оÑиÑаеÑset.
ÐеÑÐµÐ±Ð¾Ñ Set оÑÑÑеÑÑвлÑеÑÑÑ ÑеÑез forEach или for..of аналогиÑно Map:
'use strict';
let set = new Set(["апелÑÑинÑ", "Ñблоки", "бананÑ"]);
// Ñо же, ÑÑо: for(let value of set)
set.forEach((value, valueAgain, set) => {
alert(value); // апелÑÑинÑ, заÑем Ñблоки, заÑем бананÑ
});
ÐамеÑим, ÑÑо в Set Ñ ÑÑнкÑии в .forEach ÑÑи аÑгÑменÑа: знаÑение, еÑÑ Ñаз знаÑение, и заÑем Ñам пеÑебиÑаемÑй обÑÐµÐºÑ set. ÐÑи ÑÑом знаÑение повÑоÑÑеÑÑÑ Ð² аÑгÑменÑаÑ
два Ñаза.
Так Ñделано Ð´Ð»Ñ ÑовмеÑÑимоÑÑи Ñ Map, где Ñ .forEach-ÑÑнкÑии Ñакже ÑÑи аÑгÑменÑа. Ðо в Set пеÑвÑе два вÑегда ÑовпадаÑÑ Ð¸ ÑодеÑÐ¶Ð°Ñ Ð¾ÑеÑедное знаÑение множеÑÑва.
WeakMap и WeakSet
WeakSet â оÑобÑй вид Set, не пÑепÑÑÑÑвÑÑÑий ÑбоÑÑÐ¸ÐºÑ Ð¼ÑÑоÑа ÑдалÑÑÑ Ñвои ÑлеменÑÑ. То же Ñамое â WeakMap Ð´Ð»Ñ Map.
То еÑÑÑ, еÑли некий обÑÐµÐºÑ Ð¿ÑиÑÑÑÑÑвÑÐµÑ ÑолÑко в WeakSet/WeakMap â он ÑдалÑеÑÑÑ Ð¸Ð· памÑÑи.
ÐÑо нÑжно Ð´Ð»Ñ ÑÐµÑ ÑиÑÑаÑий, когда оÑновное меÑÑо Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð³Ð´Ðµ-Ñо в дÑÑгом меÑÑе кода, а здеÑÑ Ð¼Ñ Ñ Ð¾Ñим Ñ ÑаниÑÑ Ð´Ð»Ñ Ð½Ð¸Ñ Â«Ð²ÑпомогаÑелÑнÑе» даннÑе, ÑÑÑеÑÑвÑÑÑие лиÑÑ Ð¿Ð¾ÐºÐ° жив обÑекÑ.
ÐапÑимеÑ, Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑлеменÑÑ Ð½Ð° ÑÑÑаниÑе или, к пÑимеÑÑ, полÑзоваÑели, и Ð¼Ñ Ñ Ð¾Ñим Ñ ÑаниÑÑ Ð´Ð»Ñ Ð½Ð¸Ñ Ð²ÑпомогаÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ, напÑÐ¸Ð¼ÐµÑ Ð¾Ð±ÑабоÑÑики ÑобÑÑий или пÑоÑÑо даннÑе, но дейÑÑвиÑелÑнÑе лиÑÑ Ð¿Ð¾ÐºÐ° обÑекÑ, к коÑоÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ оÑноÑÑÑÑÑ, ÑÑÑеÑÑвÑеÑ.
ÐÑли помеÑÑиÑÑ Ñакие даннÑе в WeakMap, а обÑÐµÐºÑ ÑделаÑÑ ÐºÐ»ÑÑом, Ñо они бÑдÑÑ Ð°Ð²ÑомаÑиÑеÑки ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¸Ð· памÑÑи, когда ÑдалиÑÑÑ ÑлеменÑ.
ÐапÑимеÑ:
// ÑекÑÑие акÑивнÑе полÑзоваÑели
let activeUsers = [
{name: "ÐаÑÑ"},
{name: "ÐеÑÑ"},
{name: "ÐаÑа"}
];
// вÑпомогаÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ниÑ
,
// коÑоÑÐ°Ñ Ð½Ð°Ð¿ÑÑмÑÑ Ð½Ðµ вÑ
Ð¾Ð´Ð¸Ñ Ð² обÑÐµÐºÑ ÑзеÑа,
// и поÑÐ¾Ð¼Ñ Ñ
ÑаниÑÑÑ Ð¾ÑделÑно
let weakMap = new WeakMap();
weakMap.set(activeUsers[0], 1);
weakMap.set(activeUsers[1], 2);
weakMap.set(activeUsers[2], 3);
weakMap.set('Katya', 4); //ÐÑÐ´ÐµÑ Ð¾Ñибка TypeError: "Katya" is not a non-null object
alert( weakMap.get(activeUsers[0]) ); // 1
activeUsers.splice(0, 1); // ÐаÑÑ Ð±Ð¾Ð»ÐµÐµ не акÑивнÑй полÑзоваÑелÑ
// weakMap ÑепеÑÑ ÑодеÑÐ¶Ð¸Ñ ÑолÑко 2 ÑлеменÑа
activeUsers.splice(0, 1); // ÐеÑÑ Ð±Ð¾Ð»ÐµÐµ не акÑивнÑй полÑзоваÑелÑ
// weakMap ÑепеÑÑ ÑодеÑÐ¶Ð¸Ñ ÑолÑко 1 ÑлеменÑ
Таким обÑазом, WeakMap избавлÑÐµÑ Ð½Ð°Ñ Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи вÑÑÑнÑÑ ÑдалÑÑÑ Ð²ÑпомогаÑелÑнÑе даннÑе, когда ÑдалÑн оÑновной обÑекÑ.
У WeakMap еÑÑÑ ÑÑд огÑаниÑений:
- ТолÑко обÑекÑÑ Ð² каÑеÑÑве клÑÑей.
- ÐÐµÑ ÑвойÑÑва
size. - ÐелÑÐ·Ñ Ð¿ÐµÑебÑаÑÑ ÑлеменÑÑ Ð¸ÑеÑаÑоÑом или
forEach. - ÐÐµÑ Ð¼ÐµÑода
clear().
ÐнÑми Ñловами, WeakMap ÑабоÑÐ°ÐµÑ ÑолÑко на запиÑÑ (set, delete) и ÑÑение (get, has) ÑлеменÑов по конкÑеÑÐ½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ, а не как полноÑÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑиÑ. ÐелÑÐ·Ñ Ð²ÑвеÑÑи вÑÑ ÑодеÑжимое WeakMap, Ð½ÐµÑ ÑооÑвеÑÑÑвÑÑÑиÑ
меÑодов.
ÐÑо ÑвÑзано Ñ Ñем, ÑÑо ÑодеÑжимое WeakMap Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑовано ÑбоÑÑиком мÑÑоÑа в лÑбой моменÑ, незавиÑимо Ð¾Ñ Ð¿ÑогÑаммиÑÑа. СбоÑÑик мÑÑоÑа ÑабоÑÐ°ÐµÑ Ñам по Ñебе. Ðн не гаÑанÑиÑÑеÑ, ÑÑо оÑиÑÑÐ¸Ñ Ð¾Ð±ÑÐµÐºÑ ÑÑÐ°Ð·Ñ Ð¶Ðµ, когда ÑÑо ÑÑало возможнÑм. Ð Ñавной ÑÑепени он не гаÑанÑиÑÑÐµÑ Ð¸ обÑаÑное. ÐÐµÑ ÐºÐ°ÐºÐ¾Ð³Ð¾-Ñо конкÑеÑного моменÑа, когда ÑÐ°ÐºÐ°Ñ Ð¾ÑиÑÑка ÑоÑно пÑоизойдÑÑ â ÑÑо опÑеделÑеÑÑÑ Ð²Ð½ÑÑÑенними алгоÑиÑмами ÑбоÑÑика и его ÑведениÑми о ÑиÑÑеме.
ÐоÑÑÐ¾Ð¼Ñ ÑодеÑжимое WeakMap в пÑоизволÑнÑй моменÑ, ÑÑÑого говоÑÑ, не опÑеделено. ÐÐ¾Ð¶ÐµÑ Ð±ÑÑÑ, ÑбоÑÑик мÑÑоÑа Ñже Ñдалил какие-Ñо запиÑи, а Ð¼Ð¾Ð¶ÐµÑ Ð¸ неÑ. С ÑÑим, а Ñакже Ñ ÑÑебованиÑми к ÑÑÑекÑивной ÑеализаÑии WeakMap, и ÑвÑзано оÑÑÑÑÑÑвие меÑодов, оÑÑÑеÑÑвлÑÑÑиÑ
доÑÑÑп ко вÑем запиÑÑм.
То же Ñамое оÑноÑиÑÑÑ Ð¸ к WeakSet: можно добавлÑÑÑ ÑлеменÑÑ, пÑовеÑÑÑÑ Ð¸Ñ
налиÑие, но нелÑÐ·Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ñ
ÑпиÑок и даже ÑзнаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво.
ÐÑи огÑаниÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð½ÐµÑдобнÑми, но, по ÑÑÑи, они не меÑаÑÑ WeakMap/WeakSet вÑполнÑÑÑ ÑÐ²Ð¾Ñ Ð¾ÑновнÑÑ Ð·Ð°Ð´Ð°ÑÑ â бÑÑÑ Â«Ð²ÑоÑиÑнÑм» Ñ
ÑанилиÑем даннÑÑ
Ð´Ð»Ñ Ð¾Ð±ÑекÑов, акÑÑалÑнÑй ÑпиÑок коÑоÑÑÑ
(и Ñами они) Ñ
ÑаниÑÑÑ Ð² каком-Ñо дÑÑгом меÑÑе.
ÐÑого
Mapâ коллекÑÐ¸Ñ Ð·Ð°Ð¿Ð¸Ñей видаклÑÑ: знаÑение, лÑÑÑеObjectÑем, ÑÑо пеÑебиÑÐ°ÐµÑ Ð²Ñегда в поÑÑдке вÑÑавки и допÑÑÐºÐ°ÐµÑ Ð»ÑбÑе клÑÑи.Setâ коллекÑÐ¸Ñ ÑникалÑнÑÑ ÑлеменÑов, Ñакже допÑÑÐºÐ°ÐµÑ Ð»ÑбÑе клÑÑи.
ÐÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Map â ÑиÑÑаÑии, когда ÑÑÑоковÑÑ
клÑÑей не Ñ
ваÑÐ°ÐµÑ (нÑжно Ñ
ÑаниÑÑ ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð´Ð»Ñ ÐºÐ»ÑÑей-обÑекÑов), либо когда ÑÑÑоковÑй клÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑовеÑÑенно пÑоизволÑнÑм.
РпÑимеÑÑ, в обÑÑном обÑекÑе Object нелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Â«ÑовеÑÑенно лÑбÑе» клÑÑи. ÐÑÑÑ Ð²ÑÑÑоеннÑе меÑодÑ, и Ñж ÑоÑно еÑÑÑ ÑвойÑÑво Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ __proto__, коÑоÑое заÑезеÑвиÑовано ÑиÑÑемой. ÐÑли название клÑÑа даÑÑÑÑ Ð¿Ð¾ÑеÑиÑелем ÑайÑа, Ñо он Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¿ÑÑаÑÑÑÑ Ð¸ÑполÑзоваÑÑ Ñакое ÑвойÑÑво, замениÑÑ Ð¿ÑоÑоÑип, а ÑÑо, пÑи запÑÑке JavaScript на ÑеÑвеÑе, Ñже Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к ÑеÑÑÑзнÑм оÑибкам.
WeakMapиWeakSetâ «ÑÑезаннÑе» по ÑÑнкÑионалÑноÑÑи ваÑианÑÑMap/Set, коÑоÑÑе позволÑÑÑ ÑолÑко «ÑоÑеÑно» обÑаÑаÑÑÑÑ Ðº ÑлеменÑам (по конкÑеÑÐ½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ Ð¸Ð»Ð¸ знаÑениÑ). Ðни не пÑепÑÑÑÑвÑÑÑ ÑбоÑке мÑÑоÑа, Ñо еÑÑÑ, еÑли ÑÑÑлка на обÑÐµÐºÑ Ð¾ÑÑалаÑÑ ÑолÑко вWeakSet/WeakMapâ она бÑÐ´ÐµÑ Ñдалена.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)