Тип данных 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]]
codechick

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 ©