Ресурсы: Таблица со встроенными символами Документация
Необходимы для создания уникальных идентификаторов. Они уникальны и неизменяемы.
Применяются к свойствам объектов, ведь как мы знаем, кроме строк свойствами объектов ещё могут быть символы.
Символы будут уникальны, даже если будут иметь одинаковое описание.
Код
let id = Symbol('id');
let id2 = Symbol('id');
id === id2; // false
Пусть есть какой-то объект:
Код
const obj = {
name: 'Test';
}
Свойствами могут быть либо строки, либо символы. Создадим символ:
Код
let id = Symbol('id');
В скобках это описание символа.
Добавляем в наш объект новое свойство:
Смотрим в консоли его значение:
Код
console.log(obj[id]); // 1
То есть, по сути, наш объект такой:
Код
const obj = {
name: 'Test',
Symbol(id): 1
}
Символы можно создавать и без описания:
Тогда в объекте будет просто свойство
Symbol() Код
const obj = {
name: 'Test',
Symbol(): 1
}
Новый символ можно создать и непосредственно в объекте:
Код
const obj = {
name: 'Test',
[Symbol('id')]: 1
}
Но теперь мы не можем обратиться к символу, как к свойству объекта, так можно создавать скрытые свойства, которые к тому же, не выводятся при переборе объекта.
Например, перебор с помощью
for...in Код
for (let value in obj) console.log(value); // name
Но если создать символ до объекта, а в объект передать на него ссылку
Код
let id = Symbol('id');
const obj = {
name: 'Test',
[id]: 1
}
и создадим в объекте метод по получению этого
id Код
let id = Symbol('id');
const obj = {
name: 'Test',
[id]: 1,
getId: function() {
return this[id];
}
}
то теперь, вызвав этот метод, получим 1:
Код
console.log(obj.getId()); // 1
Метод Object.getOwnPropertySymbols()
Возвращает массив всех символьных свойств, найденных непосредственно на переданном в круглые скобки объекте.
Код
console.log(Object.getOwnPropertySymbols(obj));
Так можно получить первый элемент этого массива:
Код
console.log(obj[Object.getOwnPropertySymbols(obj)[0]]); // 1
Уникальность и скрытность свойства, записанного через
Symbol, позволяет нам быть уверенными, что оно не будет случайно перезаписано.
Можно "насильно" лишить символ уникальности таким образом:
Код
const myAwesomeDB = {
movies: [],
actors: [],
[Symbol.for('id')]: 123
}
console.log(myAwesomeDB[Symbol.for('id')]);
Добавлять комментарии могут только зарегистрированные пользователи.