Символы

Последнее обновление: 17.08.2021

Символ или тип Symbol представляет некоторое уникальное значение.

Для определения символа применяется конструктор типа Symbol. Например, создадим простейший символ:

const tom = Symbol("Tom");
console.log(tom);	// Symbol(Tom)

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

const tom = Symbol("Tom");
console.log(tom);	// Symbol(Tom)

const tomas = Symbol("Tom");
console.log(tomas);	// Symbol(Tom)

console.log(tom == tomas);		// false
console.log(tom === tomas);		// false

Несмотря на то, что оба создаваемых выше в примее символа инициализированы одним и тем же значением, но оба оператора - равенства и эквивалентности при сравнению этих символа возвращают false. То есть символы всегда уникальны.

Символы как идентификаторы свойств объектов

Основной областью применения символов являются определение идентификаторов свойств объектов. То есть, если вкратце, символы позволяют избежать ситуаций, когда несколько свойств объекта имеют одинаковые названия. Возможно, данная ситуация может показаться искусственной: ну как мы можем определить в объекте два одинакоых свойства? Однако если свойства добавляются динамически в довольно большой программе или даже где-то во внешнем коде, который мы не можем контролировать, то задача по контролю за идентификаторами свойств усложняется.

Для примера возьмем следующую задачу: в комании работают три программиста, один из которых старший разработчик, а остальные два - младшие разработчики. Но при этом два из разработчиков имеют одинаковые имена. Скажем, один Том является старшим разработчиком, а Сэм и другой Том - младшие разработчики. Например, мы могли бы представить подобную компанию так:

const company = { 
	"Tom": "senior",
	"Sam": "junior",
	"Tom": "junior"
}
for(developer in company) {
	console.log(`${developer} - ${company[developer]}`);
}

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

Tom - junior
Sam - junior

Теперь применим символы:

const company = { 
	[Symbol("Tom")]: "senior",
	[Symbol("Sam")]: "junior",
	[Symbol("Tom")]: "junior"
}
const developers = Object.getOwnPropertySymbols(company);
for(developer of developers) {
	console.log(`${developer.toString()} - ${company[developer]}`);
}

Для получения всех символов из объекта применяется функция Object.getOwnPropertySymbols(), в которую передается объект. Возвращает эта функция набор символов, которые мы можем перебрать в цикле. Для получения текстового представления символов можно применять метод toString() символа. А для получения значения, как и в общем случае, применяется синтаксис массивов: company[developer]. В итоге мы получим следующий консольный вывод:

Symbol(Tom) - senior
Symbol(Sam) - junior
Symbol(Tom) - junior

Также можно динамически добавлять свойства с символьными идентификаторами в объект:

const company = { };
company[Symbol("Tom")]= "senior";
company[Symbol("Sam")]= "junior";
company[Symbol("Tom")]= "junior";
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850