Символы | Symbols

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

let symbol = Symbol();

Функция Symbol() - не является конструктором поэтому мы не можем использовать ключевое слово new. У функции Symbol() - есть необязательный аргумент в котором можжно указать имя для символа.

let symbol = Symbol('symbol_name');

Символы можно также создавать использую конструкцию for(). Символы с одинаковыми именами созданные через конструкцию for() - будут идентичный друг другу. Сивволы созданные без for() - будут уникальными.

let symbol_1 = Symbol('name');
let symbol_2 = Symbol('name');
console.log( symbol_1 === symbol_2 ); // false

let symbol_3 = Symbol.for('name');
let symbol_4 = Symbol.for('name');
console.log( symbol_3 === symbol_4 ); // true

Благодаря for() - символ можно получить из любого места программы. Если символ создаётся без for(), то он не попадает в глобальный реестр и к нему нельзя получить доступ из любого места программы.

Использование символов.

В ES5 свойства объектов - должны быть строками. В ES6 свойствами объектов могут быть строки и символы.

let user = {
	username: 'r2d2',
	[Symbol.for('password')]: 'c3po'
}
console.log(user.password); // undefined

let password = user[Symbol.for('password')];
console.log(password); // c3po

В ES6 был добавлен  метод который позволяет просмотреть символы у объекта - Object.getOwnPropertySymbols(user_object).

Символы добавлены в язык чтобы избежать конфликтов имён свойств. Поэтому допустимо вот такое.

let password = Symbol();
let user = {
	username: 'r2d2',
	[password]: 'c3po',
	password: 'asdl',
}