Ця публікація про о Symbol()
фактичні приклади, які я міг би знайти / зробити, та факти та визначення, які я міг знайти.
TLDR;
Це Symbol()
тип даних, представлений з випуском ECMAScript 6 (ES6).
Є два цікавих факти щодо символу.
перший тип даних і єдиний тип даних у JavaScript, який не має літералу
будь-яка змінна, визначена за допомогою Symbol()
, отримує унікальний вміст, але насправді це не приватне .
будь-які дані , мають свій власний символ, і для одних і тих же даних , що символи були б тим же самим . Більше інформації в наступному параграфі, інакше це не TLRD; :)
Як ініціалізувати символ?
1. Отримати унікальний ідентифікатор з налагоджуваним значенням
Ви можете це зробити так:
var mySymbol1 = Symbol();
Або таким чином:
var mySymbol2 = Symbol("some text here");
"some text here"
Рядок не може бути залучена з символу, це просто опис для цілей налагодження. Це жодним чином не змінює поведінку символу. Хоча, ви могли б console.log
це зробити (що справедливо, оскільки значення призначене для налагодження, щоб не помилити цей журнал з іншим записом журналу):
console.log(mySymbol2);
// Symbol(some text here)
2. Отримати символ для деяких рядкових даних
У цьому випадку значення символу фактично враховується, і таким чином два символи можуть бути не унікальними.
var a1 = Symbol.for("test");
var a2 = Symbol.for("test");
console.log(a1 == a2); //true!
Назвемо ці символи символами "другого типу". Вони жодним чином не перетинаються з символами "першого типу" (тобто з тими, які визначені Symbol(data)
).
Наступні два абзаци стосуються лише символу першого типу .
Як мені вигідно використовувати Symbol замість старих типів даних?
Розглянемо спочатку об’єкт, типовий тип даних. Ми могли б визначити деякі пари ключ-значення там і отримати доступ до значень, вказавши ключ.
var persons = {"peter":"pan","jon":"doe"};
console.log(persons.peter);
// pan
Що робити, якщо у нас є дві людини з прізвищем Петро?
Робити це:
var persons = {"peter":"first", "peter":"pan"};
не мало б сенсу.
Отже, видається проблема двох абсолютно різних осіб, що мають одне ім’я. Давайте тоді позначимо нове Symbol()
. Це як людина в реальному житті - будь-яка людина унікальна , але їх імена можуть бути рівними. Давайте визначимо двох "осіб".
var a = Symbol("peter");
var b = Symbol("peter");
Зараз у нас є дві різні особи з тим же ім’ям. Чи справді наші особи різні? Вони є; Ви можете перевірити це:
console.log(a == b);
// false
Як ми там отримуємо користь?
Ми можемо зробити два записи у вашому об’єкті для різних осіб, і вони ні в якому разі не можуть помилитися.
var firstPerson = Symbol("peter");
var secondPerson = Symbol("peter");
var persons = {[firstPerson]:"first", [secondPerson]:"pan"};
Примітка:
Хоча варто помітити, що строфіфікація об'єкта запускає JSON.stringify
всі пари, ініціалізовані символом як ключем.
Виконання Object.keys
не поверне жодної Symbol()->value
пари.
Використовуючи цю ініціалізацію, неможливо помилити записи першої та другої осіб. Зателефонувавши console.log
до них, правильно виведете свої другі імена.
console.log(persons[a]);
// first
console.log(persons[b]);
// pan
Як він використовується в об'єкті, чим він відрізняється порівняно з визначенням властивості, яка не перелічується?
Дійсно, вже існував спосіб визначити властивість, яку слід приховати, Object.keys
і перерахувати. Ось:
var anObject = {};
var fruit = "apple";
Object.defineProperty( anObject, fruit, {
enumerable: false,
value: "green"
});
Яка різниця Symbol()
приносить туди? Різниця полягає в тому, що ви все ще можете отримати властивість, визначену за Object.defineProperty
допомогою звичайного способу:
console.log(anObject[fruit]); //green
console.log(anObject["apple"]); //green
console.log(anObject.apple); //green
І якщо визначено символом, як у попередньому абзаці:
fruit = Symbol("apple");
Ви зможете отримувати його значення лише в тому випадку, якщо знаєте його змінну, тобто
console.log(anObject[fruit]); //green
console.log(anObject["apple"]); //undefined
console.log(anObject.apple); //undefined
Більше того, визначення іншого властивості під ключем "apple"
змусить об’єкт скинути старіший (і якщо жорстко закодований, він може призвести до помилки). Отже, більше немає яблук! Шкода. Посилаючись на попередній абзац, Символи є унікальними і визначають ключ якSymbol()
зробить його унікальним.
Перетворення та перевірка
На відміну від інших типів даних, неможливо перетворити Symbol()
на будь-який інший тип даних.
Можна "зробити" символ на основі примітивного типу даних, зателефонувавши Symbol(data)
.
У плані перевірки типу нічого не змінюється.
function isSymbol ( variable ) {
return typeof someSymbol === "symbol";
}
var a_Symbol = Symbol("hey!");
var totally_Not_A_Symbol = "hey";
console.log(isSymbol(a_Symbol)); //true
console.log(isSymbol(totally_Not_A_Symbol)); //false