Свойства с типом Symbol

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

<Переменная> = Symbol([<Описание>])     // Локальный символ
<Переменная> = Symbol.for(<Название>)   // Глобальный символ

Пример:

// Локальные символы
let sym1 = Symbol();
let sym2 = Symbol('sym2');
console.log(sym1);              // Symbol()
console.log(sym2);              // Symbol(sym2)
let sym3 = Symbol('sym2');
console.log(sym3);              // Symbol(sym2)
console.log(sym2 === sym3);     // false
// Глобальные символы
let sym4 = Symbol.for('sym4');
console.log(sym4);              // Symbol(sym4)
let sym5 = Symbol.for('sym4');
console.log(sym5);              // Symbol(sym4)
console.log(sym4 === sym5);     // true

При указании одинакового описания в первом случае создается новый уникальный символ, поэтому символы не равны. При использовании метода for() сначала проверяется наличие символа с указанным в качестве параметра названием в глобальном реестре. Если символ найден, то он возвращается методом for(). В противном случае создается новый глобальный символ. Поэтому во втором случае мы получили равенство значений переменных.

Получить название символа из глобального реестра позволяет статический метод keyFor(<Символ>) из класса Symbol. Если символа нет в реестре, то метод вернет значение undefined. Обратите внимание: локальные символы не добавляются в глобальный реестр:

console.log( Symbol.keyFor(sym1) ); // undefined
console.log( Symbol.keyFor(sym2) ); // undefined
console.log( Symbol.keyFor(sym4) ); // sym4
console.log( Symbol.keyFor(sym5) ); // sym4

При добавлении свойства с типом Symbol в объект его значение указывается внутри квадратных скобок:

let sym1 = Symbol();
let sym2 = Symbol.for('sym2');
let obj = {
   [sym1]: 20
};
obj[sym2] = 3;
console.log( obj );
// { [Symbol()]: 20, [Symbol(sym2)]: 3 }

Чтобы получить значение свойства с типом Symbol нужно иметь символ, сохраненный в переменной, или воспользоваться методом for() для получения символа по названию:

console.log( obj[sym1] );                      // 20
console.log( obj[Symbol.for('sym2')] );        // 3

Следует учитывать, что свойства с типом Symbol нельзя получить с помощью методов keys(), values(), entries() и getOwnPropertyNames(), а также они недоступны для перебора с помощью цикла for...in:

console.log( Object.keys(obj) );                // []
console.log( Object.values(obj) );              // []
console.log( Object.entries(obj) );             // []
console.log( Object.getOwnPropertyNames(obj) ); // []
for (let prop in obj) {
   console.log(`${prop}`);
} // Ничего не выведет

Для получения свойств с типом Symbol следует воспользоваться статическим методом getOwnPropertySymbols(<Объект>) из класса Object, который возвращает массив с символами:

console.log( Object.getOwnPropertySymbols(obj) );
// [ Symbol(), Symbol(sym2) ]

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов