Symbol в качестве ключей объектов
Используйте Symbol для свойств, не конфликтующих между собой.
«Symbol в качестве ключей объектов» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения JavaScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс JavaScript Academy содержит 4 уроков всего.
Символы в качестве ключей
Символ можно использовать как ключ свойства объекта. Поскольку каждый символ уникален, такое свойство не может случайно пересечься ни с одним строковым ключом.
const id = Symbol("id")
const user = {}
user[id] = 123
console.log(user[id])Вычисляемые ключи-символы
Чтобы использовать символ в качестве ключа в литерале объекта, заключите его в квадратные скобки как имя вычисляемого свойства.
const id = Symbol("id")
const user = {
name: "Ann",
[id]: 99
}
console.log(user[id])Чтение свойства, заданного символом
Чтобы прочитать такое свойство, необходимо иметь ссылку на тот же символ. Без этой ссылки значение фактически скрыто.
const secret = Symbol("secret")
const obj = { [secret]: "hidden" }
console.log(obj[secret])Не перечисляются в for-in
Ключи-символы пропускаются циклом for-in. Благодаря этому свойства, заданные символами, не попадают в обычный перебор.
const tag = Symbol("tag")
const obj = { a: 1, b: 2, [tag]: 3 }
for (const key in obj) {
console.log(key)
}Пропускаются методом Object.keys
Object.keys возвращает только строковые ключи, поэтому свойства с ключами-символами также исключаются из результата.
const tag = Symbol("tag")
const obj = { a: 1, [tag]: 2 }
console.log(Object.keys(obj))Скрыты от JSON
JSON.stringify полностью игнорирует ключи-символы, поэтому они никогда не появляются в сериализованном результате. Это делает их полезными для внутренних метаданных.
const meta = Symbol("meta")
const obj = { name: "Bo", [meta]: "internal" }
console.log(JSON.stringify(obj))Поиск ключей-символов
Чтобы получить список ключей-символов, используйте Object.getOwnPropertySymbols. Этот метод возвращает массив символьных свойств объекта.
const tag = Symbol("tag")
const obj = { a: 1, [tag]: 2 }
const syms = Object.getOwnPropertySymbols(obj)
console.log(syms.length)Предотвращение конфликтов имён
Ключи-символы позволяют разным библиотекам добавлять свойства в один объект без риска перезаписать свойства друг друга, поскольку их символы различаются.
const libA = Symbol("data")
const libB = Symbol("data")
const shared = {}
shared[libA] = 1
shared[libB] = 2
console.log(shared[libA], shared[libB])Ключи-символы и разворачивание
Оператор разворачивания объекта копирует и ключи-символы, в отличие от for-in и Object.keys, поэтому учитывайте, что они переносятся при клонировании.
const tag = Symbol("tag")
const src = { a: 1, [tag]: 2 }
const copy = { ...src }
console.log(copy[tag])Хранение данных, похожих на закрытые
Ключи-символы обеспечивают мягкую форму приватности: получить доступ к данным может только код, содержащий этот символ, поэтому данные не отображаются в обычных списках свойств.
const balance = Symbol("balance")
function makeAccount() {
const acct = {}
acct[balance] = 100
return { acct: acct, key: balance }
}
const a = makeAccount()
console.log(a.acct[a.key])Удаление свойств с ключами-символами
Свойство с ключом-символом удаляется так же, как любое другое: с помощью оператора delete и ссылки на символ.
const tag = Symbol("tag")
const obj = { [tag]: 5 }
delete obj[tag]
console.log(obj[tag])Быстрая проверка
Проверьте свои знания о ключах-символах.
Повторение
Повторение: символы обеспечивают безопасные скрытые ключи объектов.
- Для вычисляемых ключей-символов используйте квадратные скобки
- Пропускаются операторами for-in, Object.keys и JSON
- Получаются с помощью Object.getOwnPropertySymbols
- Отлично подходят для метаданных без конфликтов
const k = Symbol("k")
const o = { [k]: 7 }
console.log(o[k])Часто задаваемые вопросы
Урок «Symbol в качестве ключей объектов» бесплатный?
Да — полный текст урока «Symbol в качестве ключей объектов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс JavaScript Academy, подпишись на CoddyKit PRO. Курс JavaScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Symbol в качестве ключей объектов»?
Используйте Symbol для свойств, не конфликтующих между собой. Ты практикуешь JavaScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать JavaScript Academy?
Предыдущий опыт не требуется. JavaScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Symbol в качестве ключей объектов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке JavaScript Academy?
Да. Каждый урок JavaScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Создание уникальных Symbol
- Symbol в качестве ключей объектов
- Глобальный реестр Symbol
- Хорошо известные Symbol