JavaScript Symbol — унікальний ключ властивості


Symbol (у перекладі — символ) — примітив, кожне значення якого унікальне. Два символи з однаковим описом не рівні між собою.

автор: NagarD

Загальний опис

Символ вигадали, щоб розв'язати проблему зіткнення імен. Уяви, що дві бібліотеки додають об'єкту властивість id — друга мовчки перетре першу.

Ключ-символ такого не допускає: він унікальний фізично, а не за іменем. Опис усередині Symbol('id') — лише підказка для налагодження, на рівність вона не впливає.

Властивості з ключем-символом не потрапляють ані в for...in, ані в Object.keys(), ані в JSON.stringify() — тобто вони наче приховані від звичайного коду.

Окремо є системні символи, якими мова описує саму себе: Symbol.iterator робить об'єкт перебірним у for...of, Symbol.toPrimitive керує перетворенням у число чи рядок.

автор: NagarD

Порада

Symbol.iterator — спосіб зробити свій клас перебірним у for...of. Це не хак, а офіційний протокол мови.

автор: NagarD

Синтаксис

const sym = Symbol("опис");

властивості

Властивість Опис
description Опис символа, заданий при створенні.
iterator Відомий символ: метод, що робить об'єкт ітерованим (for...of).
asyncIterator Відомий символ: асинхронний ітератор (for await...of).

методи

Метод Опис
for Повертає символ із глобального реєстру за ключем (створює за потреби).
keyFor Повертає ключ глобального символа.

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
Symbol 38+ 36+ 9+ 25+ 12+ -
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
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]
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід