JavaScript Symbol — унікальний ключ властивості
Symbol (у перекладі — символ) — примітив, кожне значення якого унікальне. Два символи з однаковим описом не рівні між собою.
Загальний опис
Символ вигадали, щоб розв'язати проблему зіткнення імен. Уяви, що дві бібліотеки додають об'єкту властивість id — друга мовчки перетре першу.
Ключ-символ такого не допускає: він унікальний фізично, а не за іменем. Опис усередині Symbol('id') — лише підказка для налагодження, на рівність вона не впливає.
Властивості з ключем-символом не потрапляють ані в for...in, ані в Object.keys(), ані в JSON.stringify() — тобто вони наче приховані від звичайного коду.
Окремо є системні символи, якими мова описує саму себе: Symbol.iterator робить об'єкт перебірним у for...of, Symbol.toPrimitive керує перетворенням у число чи рядок.
- Порада
-
автор: NagarDSymbol.iterator— спосіб зробити свій клас перебірним уfor...of. Це не хак, а офіційний протокол мови.
Синтаксис
const sym = Symbol("опис");
властивості
| Властивість | Опис |
|---|---|
| description | Опис символа, заданий при створенні. |
| iterator | Відомий символ: метод, що робить об'єкт ітерованим (for...of). |
| asyncIterator | Відомий символ: асинхронний ітератор (for await...of). |
методи
| Метод | Опис |
|---|---|
| for | Повертає символ із глобального реєстру за ключем (створює за потреби). |
| keyFor | Повертає ключ глобального символа. |
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| Symbol | 38+ | 36+ | 9+ | 25+ | 12+ | - |
| Переглядач | ||||
|---|---|---|---|---|
| Symbol | 38+ | yes | yes | 9+ |
Приклади
+ запропонувати свій приклад у пісочниці
Унікальний ключ і власний ітератор через системний символ.
const id = Symbol('id');
const other = Symbol('id');
console.log(id === other); // false — опис не робить їх рівними
const user = { name: 'Іван', [id]: 42 };
console.log(Object.keys(user)); // ['name'] — символ прихований
console.log(user[id]); // 42
// свій клас, перебірний у for...of
class Range {
constructor(from, to) {
this.from = from;
this.to = to;
}
*[Symbol.iterator]() {
for (let i = this.from; i <= this.to; i++) {
yield i;
}
}
}
console.log([...new Range(1, 4)]); // [1, 2, 3, 4]
Коментарі
Коментарів ще немає — будьте першим!