Symbol()

Symbol() создает значение типа symbol. Главная особенность символа - уникальность.

let id = Symbol();

console.log(typeof id);

Результат:

symbol

Символы используют, когда нужно создать уникальное значение, которое не совпадет с другим значением случайно.

Что такое Symbol()

Symbol() возвращает новый уникальный символ. Даже если создать два символа подряд, они будут разными.

let firstId = Symbol();
let secondId = Symbol();

console.log(firstId === secondId);

Результат:

false

На практике символы часто используют как особые ключи в объектах. Такие ключи не конфликтуют с обычными строковыми свойствами.

Синтаксис

Общая запись выглядит так:

Symbol(description);

description - необязательное описание символа. Оно нужно только для удобства при чтении кода и выводе в консоль.

let id = Symbol('id');

console.log(id);

Результат:

Symbol(id)

Symbol() вызывают как обычную функцию. Через new символы не создают.

let id = Symbol('id');

Уникальность символов

Описание не делает символы одинаковыми. Оно только помогает понять, для чего символ был создан.

let firstId = Symbol('id');
let secondId = Symbol('id');

console.log(firstId === secondId);

Результат:

false

Оба символа имеют описание id, но это два разных значения.

Описание символа

Описание можно получить через свойство description.

let id = Symbol('user id');

console.log(id.description);

Результат:

user id

Описание не участвует в сравнении и не превращает символ в строку. Это просто подпись для разработчика.

Символ как ключ объекта

Символ можно использовать как ключ свойства объекта. Для этого ключ записывают в квадратных скобках.

let id = Symbol('id');

let user = {
  name: 'Tom',
  [id]: 1
};

console.log(user[id]);

Результат:

1

Если бы мы написали id: 1 без квадратных скобок, ключом стала бы обычная строка ‘id’. Квадратные скобки говорят JavaScript взять значение из переменной id.

Свойства с ключами-символами не попадают в Object.keys().

let id = Symbol('id');

let user = {
  name: 'Tom',
  [id]: 1
};

console.log(Object.keys(user));

Результат:

['name']

Как получить символы из объекта

Если нужно получить символы, которые используются как ключи объекта, есть метод Object.getOwnPropertySymbols().

let id = Symbol('id');

let user = {
  name: 'Tom',
  [id]: 1
};

let symbols = Object.getOwnPropertySymbols(user);

console.log(symbols);
console.log(user[symbols[0]]);

Результат:

[Symbol(id)]
1

Обычно такой код нужен не на первых уроках, но полезно знать, что свойства с символами не исчезают. Они просто не показываются в списке обычных строковых ключей.

Итого

Symbol() создает уникальное значение типа symbol. Даже два символа с одинаковым описанием остаются разными.

let id = Symbol('id');

Символы чаще всего используют как уникальные ключи объектов, когда нужно не пересечься с обычными строковыми свойствами.