JavaScript значно еволюціонував з моменту свого створення, вводячи численні функції, що дозволяють розробникам писати більш ефективний та підтримуваний код.
Серед цих функцій Symbols виділяються як унікальний і потужний примітивний тип даних.
Введені в ECMAScript 2015 (ES6), Symbols є новим примітивним типом даних у JavaScript.
На відміну від інших примітивних типів, таких як рядки, числа або булеві значення, кожне значення Symbol унікальне та незмінне.
Вони здебільшого використовуються для додавання унікальних ключів властивостей до об'єктів, гарантуючи, що ці ключі не будуть конфліктувати з іншими, особливо коли йдеться про перерахування властивостей об'єктів.
- Кожен Symbol унікальний, що робить його ідеальним для визначення унікальних ключів властивостей.
- Symbols не є перераховуваними в циклах
for...in
абоObject.keys
, що допомагає створювати приховані властивості об'єктів. - Symbols дозволяють використовувати складні методи метапрограмування, даючи змогу визначати поведінку об'єктів особливим чином.
Створення Symbols
Функція Symbol()
Symbols створюються за допомогою функції Symbol()
. Кожен виклик Symbol()
повертає новий, унікальний Symbol.
const sym1 = Symbol();
const sym2 = Symbol();
console.log(sym1 === sym2); // Output: false
Навіть якщо два Symbols створено з однаковим описом, вони будуть різними:
const symA = Symbol('description');
const symB = Symbol('description');
console.log(symA === symB); // Output: false
Параметр опису
Хоча Symbols і є унікальними, вони можуть мати необов'язковий опис для налагодження. Цей опис не впливає на унікальність.
const sym = Symbol('mySymbol');
console.log(sym.description); // Output: "mySymbol"
Властивості Symbol
Примітивний тип даних
Symbols є одним з семи примітивних типів даних у JavaScript. Вони незмінні, тобто після створення Symbol його значення не можна змінити.
const sym = Symbol();
typeof sym; // "symbol"
Незмінність
Symbols незмінні і не можуть бути змінені після створення. Спроба змінити Symbol призводить до помилки.
const sym = Symbol();
sym.description = 'newDescription'; // No effect
console.log(sym.description); // Output: undefined
Використання Symbols як ключів об'єктів
Одне з основних застосувань Symbols — це використання їх як унікальних ключів властивостей для об'єктів.
Переваги перед рядками
- Запобігає випадковим зіткненням імен властивостей, особливо в великих або модульних кодових базах.
- Symbols недоступні через стандартні методи перерахунку властивостей, що дає форму приватності властивостей.
const mySymbol = Symbol('uniqueKey');
const obj = {
[mySymbol]: 'value',
regularKey: 'another value'
};
console.log(obj[mySymbol]); // Output: "value"
console.log(obj.regularKey); // Output: "another value"
// Symbols не будуть виведені в циклах for...in
for (let key in obj) {
console.log(key); // Output: "regularKey"
}
// Symbols можна отримати за допомогою Object.getOwnPropertySymbols
const symbols = Object.getOwnPropertySymbols(obj);
console.log(symbols); // [Symbol(uniqueKey)]
Symbol.for()
Хоча Symbol()
створює новий, унікальний Symbol кожного разу, Symbol.for()
перевіряє глобальний реєстр символів.
Якщо Symbol з вказаним ключем існує, він повертає цей Symbol; якщо ні, створює новий.
const globalSym1 = Symbol.for('shared');
const globalSym2 = Symbol.for('shared');
console.log(globalSym1 === globalSym2); // Output: true
Symbol.keyFor()
Цей метод отримує ключ, що асоційований з Symbol у глобальному реєстрі.
const sym = Symbol.for('sharedKey');
console.log(Symbol.keyFor(sym)); // Output: "sharedKey"
const localSym = Symbol('local');
console.log(Symbol.keyFor(localSym)); // Output: undefined
- Забезпечує, щоб різні частини програми посилались на один і той самий Symbol.
- Дозволяє бібліотекам визначати та повторно використовувати Symbols без конфліктів.
Висновок
JavaScript Symbols — це універсальна і потужна функція, яка додає рівень унікальності та приватності властивостям об'єктів.
Від запобігання зіткненням імен властивостей до використання складних методів метапрограмування, Symbols покращують гнучкість і надійність мови.
Розуміючи як основні, так і складні використання Symbols, розробники можуть писати більш безпечний, підтримуваний і ефективний JavaScript код.
Чи то ви створюєте складні бібліотеки, чи то визначаєте унікальні ключі об'єктів або налаштовуєте поведінку об'єктів за допомогою відомих Symbols, освоєння Symbols стане цінним доповненням до вашого набору інструментів JavaScript.
Щасливого кодування!
Перекладено з: Javascript Symbols Ultimate Guide