Символы - специальный тип данных с помощью которого можно создать уникальный идентификатор свойств объекта. Символы являются уникальными и неизменными значениями, они позволяют - разработчикам языка добавлять новые индентификаторы или свойства при этом не резервируя строковые названия для этих строк.
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',
}