Тип данных Symbol в JS
В этой статье вы познакомитесь с типом данных Symbol в JavaScript.
Symbol — примитивный, неизменяемый тип данных. «Символы» представляют собой уникальные идентификаторы.
Символы уникальны. Даже если создать множество символов с одинаковым описанием (именем символа), это все равно будут разные символы. Описание — это просто метка, которая ни на что не влияет.
const value1 = Symbol('привет');
const value2 = Symbol('привет');
console.log(value1 === value2); // Вывод: false
Создание символа
Для создания символа можно использовать встроенную функцию Symbol()
.
const x = Symbol()
typeof x; // symbol
Дополнительно можно добавить описание символу в виде строки.
const x = Symbol('hey');
console.log(x); // Вывод: Symbol(hey)
Доступ к описанию символа
Чтобы получить описание символа, нужно обратить к соответсвующему свойству с помощью оператора .
— символ.description
.
const x = Symbol('hey');
console.log(x.description); // Вывод: hey
Символ как ключ объекта
Символы можно использовать как ключи в объекте. Для этого нужно использовать квадратные скобки []
, как в примере ниже.
let id = Symbol("id");
let person = {
name: "Андрей",
// добавляем символ в качестве ключа
[id]: 123 // not "id": 123
};
console.log(person); // {name: "Андрей", Symbol(id): 123}
Символы игнорируются циклом for...in
Цикл for...in игнорирует свойства типа Symbol при переборе свойств объекта.
let id = Symbol("id");
let person = {
name: "Андрей",
age: 25,
[id]: 12
};
// используем for...in
for (let key in person) {
console.log(key);
}
Вывод
name age
Преимущества использования символов в объекте
Если один и тот же фрагмент кода используется в разных программах, то в ключе объекта лучше использовать значения типа Symbol. Так вы сможете использовать одно и то же имя ключа в разных кусках кода и избежать дублирования.
let person = {
name: "Андрей"
};
// создаем переменную типа Symbol
let id = Symbol("id");
// добавляем символ в качестве ключа
person[id] = 12;
Допустим, объект person
также используется другой программой. Тогда нежелательно, чтобы определенное свойство эта программа могла поменять или посмотреть. Для этого мы используем в качестве ключа Symbol — так получается уникальное свойство, обратиться к которому из другой программы уже не получится.
Если же мы хотим использовать свойство id
в другой программе, нужно создать в этой программме Symbol с именем id
.
let person = {
name: "Андрей"
};
let id = Symbol("id");
person[id] = "Другое значение";
Даже если для хранения значений используется одно и то же имя, тип данных Symbol будет иметь уникальное значение.
Если бы в коде выше мы использовали ключ в виде стороки, то программа ниже могла бы изменить значение свойства.
let person = {
name: "Андрей"
};
// используем строку в качестве ключа
person.id = 12;
console.log(person.id); // Вывод: 12
// другая программа перезаписывает значение
person.id = 'Другое значение';
console.log(person.id); // Вывод: Другое значение
В программе выше второе использование person.id
перезаписывает значение свойства id
.
Методы символов
Метод | Описание |
for() |
Ищет существующие символы. |
keyFor() |
Возвращает ключ для заданного символа из глобального реестра символов. |
toString() |
Возвращает описание символа в виде строки. |
valueOf() |
Возвращает примитивное значение символьного объекта. |
Рассмотрим некоторые методы на примере:
// получаем символ по имени
let sym = Symbol.for('привет');
let sym1 = Symbol.for('id');
// получаем имя по символу
console.log( Symbol.keyFor(sym) ); // Вывод: привет
console.log( Symbol.keyFor(sym1) ); // Вывод: id
Свойства символов
Свойство | Описание |
asyncIterator |
Возвращает асинхронный итератор по умолчанию. |
hasInstance |
Определяет, распознает ли объект конструктора объект как свой инстанс. |
isConcatSpreadable |
Указывает, должен ли быть объект сплющен до элементов массива. |
iterator |
Возвращает итератор по умолчанию. |
match |
Сравнивает со строкой. |
matchAll |
Возвращает итератор, который выдает совпадения регулярного выражения со строкой. |
replace |
Заменяет совпадающие подстроки строки. |
search |
Возвращает индекс в строке, который соответствует регулярному выражению. |
split |
Разделяет строку по индексам, которые соответствуют регулярному выражению. |
species |
Создает производные объекты. |
toPrimitive |
Преобразует объект в примитивное значение. |
toStringTag |
Возвращает описание объекта по умолчанию. |
description |
Возвращает описание объекта в виде строки. |
Рассмотрим некоторые свойства на примере:
const x = Symbol('hey');
// получаем описание свойства
console.log(x.description); // Вывод: hey
const stringArray = ['a', 'b', 'c'];
const numberArray = [1, 2, 3];
// используем свойство isConcatSpreadable
numberArray[Symbol.isConcatSpreadable] = false;
let result = stringArray.concat(numberArray);
console.log(result); // Вывод: ["a", "b", "c", [1, 2, 3]]