У цьому посібнику ви дізнаєтеся про символ JavaScript на прикладах.
Символ JavaScript
JavaScript ES6 представив новий примітивний тип даних, який називається Symbol
. Символи незмінні (не можуть бути змінені) і є унікальними. Наприклад,
// two symbols with the same description const value1 = Symbol('hello'); const value2 = Symbol('hello'); console.log(value1 === value2); // false
Хоча значення1 і значення2 містять однаковий опис, вони різні.
Створення символу
Ви використовуєте Symbol()
функцію для створення Symbol
. Наприклад,
// creating symbol const x = Symbol() typeof x; // symbol
Ви можете передати необов’язковий рядок як його опис. Наприклад,
const x = Symbol('hey'); console.log(x); // Symbol(hey)
Опис символу доступу
Для доступу до опису символу ми використовуємо .
оператор. Наприклад,
const x = Symbol('hey'); console.log(x.description); // hey
Додайте символ як ключ об’єкта
Ви можете додати символи як ключ до об’єкта за допомогою квадратних дужок ()
. Наприклад,
let id = Symbol("id"); let person = ( name: "Jack", // adding symbol as a key (id): 123 // not "id": 123 ); console.log(person); // (name: "Jack", Symbol(id): 123)
Символи не включені в для… у циклі
for… in
Цикл не ітерацію над символічними властивостями. Наприклад,
let id = Symbol("id"); let person = ( name: "Jack", age: 25, (id): 12 ); // using for… in for (let key in person) ( console.log(key); )
Вихідні дані
ім'я вік
Перевага використання символів у об’єкті
Якщо один і той же фрагмент коду використовується в різних програмах, то краще використовувати Symbols
в ключі об'єкта. Це тому, що ви можете використовувати одне й те саме ім’я ключа в різних кодах та уникати проблем із дублюванням. Наприклад,
let person = ( name: "Jack" ); // creating Symbol let id = Symbol("id"); // adding symbol as a key person(id) = 12;
У наведеній вище програмі, якщо person
об’єкт також використовується іншою програмою, ви не хочете додавати властивість, до якої може отримати доступ або змінити інша програма. Отже, використовуючи Symbol
, ви створюєте унікальну властивість, яку можете використовувати.
Тепер, якщо для іншої програми також потрібно використовувати властивість з ідентифікатором , просто додайте символ з іменем, id
і проблем із дублюванням не буде. Наприклад,
let person = ( name: "Jack" ); let id = Symbol("id"); person(id) = "Another value";
У наведеній вище програмі, навіть якщо одне і те саме використовується для зберігання значень, Symbol
тип даних матиме унікальне значення.
У наведеній вище програмі, якби використовувався рядовий ключ, то пізніша програма змінила б значення властивості. Наприклад,
let person = ( name: "Jack" ); // using string as key person.id = 12; console.log(person.id); // 12 // Another program overwrites value person.id = 'Another value'; console.log(person.id); // Another value
У наведеній вище програмі друга user.id
замінює попереднє значення.
Символьні методи
З Symbol доступні різні методи.
Метод | Опис |
---|---|
for() | Пошук існуючих символів |
keyFor() | Повертає загальний ключ символу з глобального реєстру символів. |
toSource() | Повертає рядок, що містить джерело об'єкта Symbol |
toString() | Повертає рядок, що містить опис символу |
valueOf() | Повертає примітивне значення об'єкта Symbol. |
Приклад: Символьні методи
// get symbol by name let sym = Symbol.for('hello'); let sym1 = Symbol.for('id'); // get name by symbol console.log( Symbol.keyFor(sym) ); // hello console.log( Symbol.keyFor(sym1) ); // id
Властивості символу
Властивості | Опис |
---|---|
asyncIterator | Повертає стандартний AsyncIterator для об'єкта |
hasInstance | Визначає, чи розпізнає об’єкт-конструктор об’єкт як його примірник |
isConcatSpreadable | Вказує, чи слід об’єкт об’єднувати з елементами масиву |
iterator | Повертає ітератор за замовчуванням для об'єкта |
match | Збіги проти рядка |
matchAll | Повертає ітератор, який видає збіги регулярного виразу з рядком |
replace | Замінює відповідні підрядки рядка |
search | Повертає індекс у рядку, який відповідає регулярному виразу |
split | Розбиває рядок на індекси, які відповідають регулярному виразу |
species | Створює похідні об'єкти |
toPrimitive | Перетворює об'єкт на примітивне значення |
toStringTag | Дає опис об’єкта за замовчуванням |
description | Повертає рядок, що містить опис символу |
Приклад: Приклад властивостей символу
const x = Symbol('hey'); // description property console.log(x.description); // hey const stringArray = ('a', 'b', 'c'); const numberArray = (1, 2, 3); // isConcatSpreadable property numberArray(Symbol.isConcatSpreadable) = false; let result = stringArray.concat(numberArray); console.log(result); // ("a", "b", "c", (1, 2, 3))