Ðо ÑпеÑиÑикаÑии, в каÑеÑÑве клÑÑей Ð´Ð»Ñ ÑвойÑÑв обÑекÑа могÑÑ Ð¸ÑполÑзоваÑÑÑÑ ÑолÑко ÑÑÑоки или ÑимволÑ. Ðи ÑиÑла, ни логиÑеÑкие знаÑÐµÐ½Ð¸Ñ Ð½Ðµ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ, ÑазÑеÑÐµÐ½Ñ ÑолÑко ÑÑи два Ñипа даннÑÑ .
Ðо ÑÐ¸Ñ Ð¿Ð¾Ñ Ð¼Ñ Ð²Ð¸Ð´ÐµÐ»Ð¸ ÑолÑко ÑÑÑоки. ТепеÑÑ Ð´Ð°Ð²Ð°Ð¹Ñе ÑазбеÑÑм ÑимволÑ, Ñвидим, ÑÑо Ñ Ð¾ÑоÑего они нам даÑÑ.
СимволÑ
«Символ» пÑедÑÑавлÑÐµÑ Ñобой ÑникалÑнÑй иденÑиÑикаÑоÑ.
СоздаÑÑÑÑ Ð½Ð¾Ð²Ñе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии Symbol():
// СоздаÑм новÑй Ñимвол - id
let id = Symbol();
ÐÑи Ñоздании, ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¼Ð¾Ð¶Ð½Ð¾ даÑÑ Ð¾Ð¿Ð¸Ñание (Ñакже назÑваемое имÑ), в оÑновном иÑполÑзÑÑÑееÑÑ Ð´Ð»Ñ Ð¾Ñладки кода:
// СоздаÑм Ñимвол id Ñ Ð¾Ð¿Ð¸Ñанием (именем) "id"
let id = Symbol("id");
Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ Ð³Ð°ÑанÑиÑованно ÑникалÑнÑ. Ðаже еÑли Ð¼Ñ Ñоздадим множеÑÑво Ñимволов Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм опиÑанием, ÑÑо вÑÑ Ñавно бÑдÑÑ ÑазнÑе ÑимволÑ. ÐпиÑание â ÑÑо пÑоÑÑо меÑка, коÑоÑÐ°Ñ Ð½Ð¸ на ÑÑо не влиÑеÑ.
ÐапÑимеÑ, Ð²Ð¾Ñ Ð´Ð²Ð° Ñимвола Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм опиÑанием â но они не ÑавнÑ:
let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false
ÐÑли Ð²Ñ Ð·Ð½Ð°ÐµÑе Ruby или какой-Ñо дÑÑгой ÑзÑк пÑогÑаммиÑованиÑ, в коÑоÑом еÑÑÑ Ñвоего Ñода «ÑимволÑ» â пожалÑйÑÑа, бÑдÑÑе внимаÑелÑнÑ. Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ Ð² JavaScript имеÑÑ Ñвои оÑобенноÑÑи, и не ÑÑÐ¾Ð¸Ñ Ð´ÑмаÑÑ Ð¾ Ð½Ð¸Ñ , как о ÑÐ¸Ð¼Ð²Ð¾Ð»Ð°Ñ Ð² Ruby или в дÑÑÐ³Ð¸Ñ ÑзÑÐºÐ°Ñ .
ÐолÑÑинÑÑво Ñипов даннÑÑ
в JavaScript могÑÑ Ð±ÑÑÑ Ð½ÐµÑвно пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ñ Ð² ÑÑÑокÑ. ÐапÑимеÑ, ÑÑнкÑÐ¸Ñ alert пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¿ÑакÑиÑеÑки лÑбое знаÑение, авÑомаÑиÑеÑки пÑеобÑазовÑÐ²Ð°ÐµÑ ÐµÐ³Ð¾ в ÑÑÑокÑ, а заÑем вÑÐ²Ð¾Ð´Ð¸Ñ ÑÑо знаÑение, не ÑообÑÐ°Ñ Ð¾Ð± оÑибке. Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ Ð¶Ðµ оÑобеннÑе и не пÑеобÑазÑÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки.
РпÑимеÑÑ, alert ниже вÑдаÑÑ Ð¾ÑибкÑ:
let id = Symbol("id");
alert(id); // TypeError: Cannot convert a Symbol value to a string
ÐÑо â ÑзÑÐºÐ¾Ð²Ð°Ñ Â«Ð·Ð°ÑиÑа» Ð¾Ñ Ð¿ÑÑаниÑÑ, Ð²ÐµÐ´Ñ ÑÑÑоки и ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ â пÑинÑипиалÑно ÑазнÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½ÐµÐºÐ¾Ð½ÑÑолиÑÑемо пÑеобÑазовÑваÑÑÑÑ Ð´ÑÑг в дÑÑга.
ÐÑли же Ð¼Ñ Ð´ÐµÐ¹ÑÑвиÑелÑно Ñ
оÑим вÑвеÑÑи Ñимвол Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ alert, Ñо необÑ
одимо Ñвно пÑеобÑазоваÑÑ ÐµÐ³Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода .toString(), Ð²Ð¾Ñ Ñак:
let id = Symbol("id");
alert(id.toString()); // Symbol(id), ÑепеÑÑ ÑабоÑаеÑ
Ðли Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ обÑаÑиÑÑÑÑ Ðº ÑвойÑÑÐ²Ñ symbol.description, ÑÑÐ¾Ð±Ñ Ð²ÑвеÑÑи ÑолÑко опиÑание:
let id = Symbol("id");
alert(id.description); // id
«СкÑÑÑÑе» ÑвойÑÑва
Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ ÑоздаваÑÑ Â«ÑкÑÑÑÑе» ÑвойÑÑва обÑекÑов, к коÑоÑÑм нелÑÐ·Ñ Ð½ÐµÑаÑнно обÑаÑиÑÑÑÑ Ð¸ пеÑезапиÑаÑÑ Ð¸Ñ Ð¸Ð· дÑÑÐ³Ð¸Ñ ÑаÑÑей пÑогÑаммÑ.
ÐапÑимеÑ, Ð¼Ñ ÑабоÑаем Ñ Ð¾Ð±ÑекÑами user, коÑоÑÑе пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ ÑÑоÑÐ¾Ð½Ð½ÐµÐ¼Ñ ÐºÐ¾Ð´Ñ. ÐÑ Ñ
оÑим добавиÑÑ Ðº ним иденÑиÑикаÑоÑÑ.
ÐÑполÑзÑем Ð´Ð»Ñ ÑÑого ÑимволÑнÑй клÑÑ:
let user = {
name: "ÐаÑÑ"
};
let id = Symbol("id");
user[id] = 1;
alert( user[id] ); // Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ полÑÑиÑÑ Ð´Ð¾ÑÑÑп к даннÑм по клÑÑÑ-ÑимволÑ
ÐоÑÐµÐ¼Ñ Ð¶Ðµ лÑÑÑе иÑполÑзоваÑÑ Symbol("id"), а не ÑÑÑÐ¾ÐºÑ "id"?
Так как обÑÐµÐºÑ user пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ ÑÑоÑÐ¾Ð½Ð½ÐµÐ¼Ñ ÐºÐ¾Ð´Ñ, и ÑÑÐ¾Ñ ÐºÐ¾Ð´ Ñакже ÑабоÑÐ°ÐµÑ Ñ Ð½Ð¸Ð¼, Ñо нам не ÑледÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ðº Ð½ÐµÐ¼Ñ ÐºÐ°ÐºÐ¸Ðµ-либо полÑ. ÐÑо небезопаÑно. Ðо к ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ñложно неÑаÑнно обÑаÑиÑÑÑÑ, ÑÑоÑонний код вÑÑд ли его вообÑе ÑвидиÑ, и, ÑкоÑее вÑего, добавление Ð¿Ð¾Ð»Ñ Ðº обÑекÑÑ Ð½Ðµ вÑÐ·Ð¾Ð²ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
пÑоблем.
ÐÑоме Ñого, пÑедположим, ÑÑо дÑÑгой ÑкÑÐ¸Ð¿Ñ Ð´Ð»Ñ ÐºÐ°ÐºÐ¸Ñ
-Ñо ÑвоиÑ
Ñелей Ñ
оÑÐµÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ ÑобÑÑвеннÑй иденÑиÑикаÑÐ¾Ñ Ð² обÑÐµÐºÑ user. ÐÑÐ¾Ñ ÑкÑÐ¸Ð¿Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÐºÐ°ÐºÐ¾Ð¹-Ñо JavaScript-библиоÑекой, абÑолÑÑно не ÑвÑзанной Ñ Ð½Ð°Ñим ÑкÑипÑом.
СÑоÑонний код Ð¼Ð¾Ð¶ÐµÑ ÑоздаÑÑ Ð´Ð»Ñ ÑÑого Ñвой Ñимвол Symbol("id"):
// ...
let id = Symbol("id");
user[id] = "ÐÑ
иденÑиÑикаÑоÑ";
ÐонÑликÑа Ð¼ÐµÐ¶Ð´Ñ Ð¸Ñ Ð¸ наÑим иденÑиÑикаÑоÑом не бÑдеÑ, Ñак как ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð²Ñегда ÑникалÑнÑ, даже еÑли Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð° ÑовпадаÑÑ.
Ð Ð²Ð¾Ñ ÐµÑли Ð±Ñ Ð¼Ñ Ð¸ÑполÑзовали ÑÑÑÐ¾ÐºÑ "id" вмеÑÑо Ñимвола, Ñо Ñогда бÑл Ð±Ñ ÐºÐ¾Ð½ÑликÑ:
let user = { name: "ÐаÑÑ" };
// ÐбÑÑвлÑем в наÑем ÑкÑипÑе ÑвойÑÑво "id"
user.id = "ÐÐ°Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑ";
// ...дÑÑгой ÑкÑÐ¸Ð¿Ñ Ñоже Ñ
оÑÐµÑ Ñвой иденÑиÑикаÑоÑ...
user.id = "ÐÑ
иденÑиÑикаÑоÑ"
// Ðй! СвойÑÑво пеÑезапиÑано ÑÑоÑонней библиоÑекой!
Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ Ð² лиÑеÑалÑном обÑекÑе
ÐÑли Ð¼Ñ Ñ
оÑим иÑполÑзоваÑÑ Ñимвол пÑи лиÑеÑалÑном обÑÑвлении обÑекÑа {...}, его необÑ
одимо заклÑÑиÑÑ Ð² квадÑаÑнÑе Ñкобки.
ÐÐ¾Ñ Ñак:
let id = Symbol("id");
let user = {
name: "ÐаÑÑ",
[id]: 123 // пÑоÑÑо "id: 123" не ÑÑабоÑаеÑ
};
ÐÑо вÑзвано Ñем, ÑÑо нам нÑжно иÑполÑзоваÑÑ Ð·Ð½Ð°Ñение пеÑеменной id в каÑеÑÑве клÑÑа, а не ÑÑÑÐ¾ÐºÑ Â«id».
Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑÑÑÑÑ Ñиклом forâ¦in
СвойÑÑва, ÑÑи клÑÑи â ÑимволÑ, не пеÑебиÑаÑÑÑÑ Ñиклом for..in.
ÐапÑимеÑ:
let id = Symbol("id");
let user = {
name: "ÐаÑÑ",
age: 30,
[id]: 123
};
for (let key in user) alert(key); // name, age (ÑвойÑÑва Ñ ÐºÐ»ÑÑом-Ñимволом Ð½ÐµÑ ÑÑеди пеÑеÑиÑленнÑÑ
)
// Ñ
оÑÑ Ð¿ÑÑмой доÑÑÑп по ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ÑабоÑаеÑ
alert( "ÐапÑÑмÑÑ: " + user[id] );
ÐÑо â ÑаÑÑÑ Ð¾Ð±Ñего пÑинÑипа «ÑокÑÑÑÐ¸Ñ ÑимволÑнÑÑ
ÑвойÑÑв». ÐÑли дÑÑÐ³Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека или ÑкÑÐ¸Ð¿Ñ Ð±ÑдÑÑ ÑабоÑаÑÑ Ñ Ð½Ð°Ñим обÑекÑом, Ñо пÑи пеÑебоÑе они не полÑÑÐ°Ñ Ð½ÐµÐ½Ð°Ñоком наÑе ÑимволÑное ÑвойÑÑво. Object.keys(user) Ñакже игноÑиÑÑÐµÑ ÑимволÑ.
Ð Ð²Ð¾Ñ Object.assign, в оÑлиÑие Ð¾Ñ Ñикла for..in, копиÑÑÐµÑ Ð¸ ÑÑÑоковÑе, и ÑимволÑнÑе ÑвойÑÑва:
let id = Symbol("id");
let user = {
[id]: 123
};
let clone = Object.assign({}, user);
alert( clone[id] ); // 123
ÐдеÑÑ Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð³Ð¾ паÑадокÑа или пÑоÑивоÑеÑиÑ. Так и задÑмано. ÐÐ´ÐµÑ Ð·Ð°ÐºÐ»ÑÑаеÑÑÑ Ð² Ñом, ÑÑо, когда Ð¼Ñ ÐºÐ»Ð¾Ð½Ð¸ÑÑем или обÑединÑем обÑекÑÑ, Ð¼Ñ Ð¾Ð±ÑÑно Ñ
оÑим ÑкопиÑоваÑÑ Ð²Ñе ÑвойÑÑва (вклÑÑÐ°Ñ Ñакие ÑвойÑÑва Ñ ÐºÐ»ÑÑами-Ñимволами, как, напÑимеÑ, id в пÑимеÑе вÑÑе).
ÐлобалÑнÑе ÑимволÑ
ÐÑак, как Ð¼Ñ Ð²Ð¸Ð´ÐµÐ»Ð¸, обÑÑно вÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ÑникалÑнÑ, даже еÑли иÑ
имена ÑовпадаÑÑ. Ðо иногда Ð¼Ñ Ð½Ð°Ð¾Ð±Ð¾ÑÐ¾Ñ Ñ
оÑим, ÑÑÐ¾Ð±Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми именами бÑли одной ÑÑÑноÑÑÑÑ. ÐапÑимеÑ, ÑазнÑе ÑаÑÑи наÑего пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ
оÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ "id", подÑазÑÐ¼ÐµÐ²Ð°Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ одно и Ñо же ÑвойÑÑво.
ÐÐ»Ñ ÑÑого ÑÑÑеÑÑвÑÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑй ÑееÑÑÑ Ñимволов. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаваÑÑ Ð² нÑм ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¸ обÑаÑаÑÑÑÑ Ðº ним позже, и пÑи каждом обÑаÑении нам гаÑанÑиÑованно бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ Ñимвол.
ÐÐ»Ñ ÑÑÐµÐ½Ð¸Ñ (или, пÑи оÑÑÑÑÑÑвии, ÑозданиÑ) Ñимвола из ÑееÑÑÑа иÑполÑзÑеÑÑÑ Ð²Ñзов Symbol.for(key).
Ðн пÑовеÑÑÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑй ÑееÑÑÑ Ð¸, пÑи налиÑии в нÑм Ñимвола Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ key, возвÑаÑÐ°ÐµÑ ÐµÐ³Ð¾, инаÑе же ÑоздаÑÑÑÑ Ð½Ð¾Ð²Ñй Ñимвол Symbol(key) и запиÑÑваеÑÑÑ Ð² ÑееÑÑÑ Ð¿Ð¾Ð´ клÑÑом key.
ÐапÑимеÑ:
// ÑиÑаем Ñимвол из глобалÑного ÑееÑÑÑа и запиÑÑваем его в пеÑеменнÑÑ
let id = Symbol.for("id"); // еÑли Ñимвола не ÑÑÑеÑÑвÑеÑ, он бÑÐ´ÐµÑ Ñоздан
// ÑиÑаем его Ñнова и запиÑÑваем в дÑÑгÑÑ Ð¿ÐµÑеменнÑÑ (возможно, из дÑÑгого меÑÑа кода)
let idAgain = Symbol.for("id");
// пÑовеÑÑем -- ÑÑо один и ÑÐ¾Ñ Ð¶Ðµ Ñимвол
alert( id === idAgain ); // true
СимволÑ, ÑодеÑжаÑиеÑÑ Ð² ÑееÑÑÑе, назÑваÑÑÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑми Ñимволами. ÐÑли вам нÑжен Ñимвол, доÑÑÑпнÑй везде в коде â иÑполÑзÑйÑе глобалÑнÑе ÑимволÑ.
РнекоÑоÑÑÑ ÑзÑÐºÐ°Ñ Ð¿ÑогÑаммиÑованиÑ, напÑимеÑ, Ruby, на одно Ð¸Ð¼Ñ (опиÑание) пÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑÑ Ð¾Ð´Ð¸Ð½ Ñимвол, и не могÑÑ ÑÑÑеÑÑвоваÑÑ ÑазнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм именем.
Ð JavaScript, как Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, ÑÑо ÑÑвеÑждение веÑно ÑолÑко Ð´Ð»Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ Ñимволов.
Symbol.keyFor
ÐÐ»Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ
Ñимволов, кÑоме Symbol.for(key), коÑоÑÑй иÑÐµÑ Ñимвол по имени, ÑÑÑеÑÑвÑÐµÑ Ð¾Ð±ÑаÑнÑй меÑод: Symbol.keyFor(sym), коÑоÑÑй, наобоÑоÑ, пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑй Ñимвол и возвÑаÑÐ°ÐµÑ ÐµÐ³Ð¾ имÑ.
РпÑимеÑÑ:
// полÑÑаем Ñимвол по имени
let sym = Symbol.for("name");
let sym2 = Symbol.for("id");
// полÑÑаем Ð¸Ð¼Ñ Ð¿Ð¾ ÑимволÑ
alert( Symbol.keyFor(sym) ); // name
alert( Symbol.keyFor(sym2) ); // id
ÐнÑÑÑи меÑода Symbol.keyFor иÑполÑзÑеÑÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑй ÑееÑÑÑ Ñимволов Ð´Ð»Ñ Ð½Ð°Ñ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ Ñимвола. Так ÑÑо ÑÑÐ¾Ñ Ð¼ÐµÑод не бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ
Ñимволов. ÐÑли Ñимвол неглобалÑнÑй, меÑод не ÑÐ¼Ð¾Ð¶ÐµÑ ÐµÐ³Ð¾ найÑи и веÑнÑÑ undefined.
ÐпÑоÑем, Ð´Ð»Ñ Ð»ÑбÑÑ
Ñимволов доÑÑÑпно ÑвойÑÑво description.
ÐапÑимеÑ:
let globalSymbol = Symbol.for("name");
let localSymbol = Symbol("name");
alert( Symbol.keyFor(globalSymbol) ); // name, глобалÑнÑй Ñимвол
alert( Symbol.keyFor(localSymbol) ); // undefined Ð´Ð»Ñ Ð½ÐµÐ³Ð»Ð¾Ð±Ð°Ð»Ñного Ñимвола
alert( localSymbol.description ); // name
СиÑÑемнÑе ÑимволÑ
СÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво «ÑиÑÑемнÑÑ Â» Ñимволов, иÑполÑзÑÑÑÐ¸Ñ ÑÑ Ð²Ð½ÑÑÑи Ñамого JavaScript, и Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð¸Ñ , ÑÑÐ¾Ð±Ñ Ð½Ð°ÑÑÑаиваÑÑ ÑазлиÑнÑе аÑпекÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов.
ÐÑи ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² ÑпеÑиÑикаÑии в ÑаблиÑе Well-known symbols:
Symbol.hasInstanceSymbol.isConcatSpreadableSymbol.iteratorSymbol.toPrimitive- â¦Ð¸ Ñак далее.
Ð ÑаÑÑноÑÑи, Symbol.toPrimitive позволÑÐµÑ Ð¾Ð¿Ð¸ÑаÑÑ Ð¿Ñавила Ð´Ð»Ñ Ð¾Ð±ÑекÑа, ÑоглаÑно коÑоÑÑм он бÑÐ´ÐµÑ Ð¿ÑеобÑазовÑваÑÑÑÑ Ðº пÑимиÑивÑ. ÐÑ ÑкоÑо Ñвидим его пÑименение.
С дÑÑгими ÑиÑÑемнÑми Ñимволами Ð¼Ñ Ñоже ÑкоÑо познакомимÑÑ, когда бÑдем изÑÑаÑÑ ÑооÑвеÑÑÑвÑÑÑие возможноÑÑи ÑзÑка.
ÐÑого
Символ (symbol) â пÑимиÑивнÑй Ñип даннÑÑ , иÑполÑзÑÑÑийÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑникалÑнÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑов.
Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ ÑоздаÑÑÑÑ Ð²Ñзовом ÑÑнкÑии Symbol(), в коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ пеÑедаÑÑ Ð¾Ð¿Ð¸Ñание (имÑ) Ñимвола.
Ðаже еÑли ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð½Ð¾ и Ñо же имÑ, ÑÑо â ÑазнÑе ÑимволÑ. ÐÑли Ð¼Ñ Ñ
оÑим, ÑÑÐ¾Ð±Ñ Ð¾Ð´Ð½Ð¾Ð¸Ð¼ÑннÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð±Ñли ÑавнÑ, Ñо ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑй ÑееÑÑÑ: вÑзов Symbol.for(key) возвÑаÑÐ°ÐµÑ (или ÑоздаÑÑ) глобалÑнÑй Ñимвол Ñ key в каÑеÑÑве имени. ÐногокÑаÑнÑе вÑÐ·Ð¾Ð²Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Symbol.for Ñ Ð¾Ð´Ð½Ð¸Ð¼ и Ñем же аÑгÑменÑом возвÑаÑаÑÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ Ñимвол.
Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð¼ÐµÑÑ Ð´Ð²Ð° оÑновнÑÑ Ð²Ð°ÑианÑа иÑполÑзованиÑ:
-
«СкÑÑÑÑе» ÑвойÑÑва обÑекÑов.
ÐÑли Ð¼Ñ Ñ Ð¾Ñим добавиÑÑ ÑвойÑÑво в обÑекÑ, коÑоÑÑй «пÑинадлежиÑ» дÑÑÐ³Ð¾Ð¼Ñ ÑкÑипÑÑ Ð¸Ð»Ð¸ библиоÑеке, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ Ñимвол и иÑполÑзоваÑÑ ÐµÐ³Ð¾ в каÑеÑÑве клÑÑа. СимволÑное ÑвойÑÑво не поÑвиÑÑÑ Ð²
for..in, Ñак ÑÑо оно не бÑÐ´ÐµÑ Ð½ÐµÑаÑнно обÑабоÑано вмеÑÑе Ñ Ð´ÑÑгими. Также оно не бÑÐ´ÐµÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑовано пÑÑмÑм обÑаÑением, Ñак как дÑÑгой ÑкÑÐ¸Ð¿Ñ Ð½Ðµ Ð·Ð½Ð°ÐµÑ Ð¾ наÑем Ñимволе. Таким обÑазом, ÑвойÑÑво бÑÐ´ÐµÑ Ð·Ð°ÑиÑено Ð¾Ñ ÑлÑÑайной пеÑезапиÑи или иÑполÑзованиÑ.Так ÑÑо, иÑполÑзÑÑ ÑимволÑнÑе ÑвойÑÑва, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑпÑÑÑаÑÑ ÑÑо-Ñо нÑжное нам, но ÑÑо дÑÑгие видеÑÑ Ð½Ðµ должнÑ.
-
СÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑиÑÑемнÑÑ Ñимволов, иÑполÑзÑемÑÑ Ð²Ð½ÑÑÑи JavaScript, доÑÑÑпнÑÑ ÐºÐ°Ðº
Symbol.*. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð¸Ñ , ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð²ÑÑÑоенное поведение ÑÑда обÑекÑов. ÐапÑимеÑ, в далÑнейÑÐ¸Ñ Ð³Ð»Ð°Ð²Ð°Ñ Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑSymbol.iteratorÐ´Ð»Ñ Ð¸ÑеÑаÑоÑов,Symbol.toPrimitiveÐ´Ð»Ñ Ð½Ð°ÑÑÑойки пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов в пÑимиÑÐ¸Ð²Ñ Ð¸ Ñак далее.
Ð¢ÐµÑ Ð½Ð¸ÑеÑки ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ÑкÑÑÑÑ Ð½Ðµ на 100%. СÑÑеÑÑвÑÐµÑ Ð²ÑÑÑоеннÑй меÑод Object.getOwnPropertySymbols(obj) â Ñ ÐµÐ³Ð¾ помоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ Ð²Ñе ÑвойÑÑва обÑекÑа Ñ ÐºÐ»ÑÑами-Ñимволами. Также ÑÑÑеÑÑвÑÐµÑ Ð¼ÐµÑод Reflect.ownKeys(obj), коÑоÑÑй возвÑаÑÐ°ÐµÑ Ð²Ñе клÑÑи обÑекÑа, вклÑÑÐ°Ñ ÑимволÑнÑе. Так ÑÑо они не ÑовÑем ÑпÑÑÑанÑ. Ðо болÑÑинÑÑво библиоÑек, вÑÑÑоеннÑÑ Ð¼ÐµÑодов и ÑинÑакÑиÑеÑÐºÐ¸Ñ ÐºÐ¾Ð½ÑÑÑÑкÑий не иÑполÑзÑÑÑ ÑÑи меÑодÑ.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)