Символы (Symbols) - это новый тип данных, который появился в редакции ECMAScript 2015. Примитивы символьного типа являются уникальными и неизменяемыми. Создаются с использованием конструктора Symbol
:
let s1 = Symbol();
let s2 = Symbol('описание символа');
В качестве параметра конструктор Symbol
принимает необязательную строку - описание символа. Это описание может быть полезно при отладке. Доступ к символу по данному параметру невозможен.
Символы являются уникальными и неизменяемыми:
let s3 = Symbol('символ');
let s4 = Symbol('символ');
console.log(s3 === s4); // false
А также их можно использовать в качестве ключей для свойств объектов:
let s = Symbol();
let obj = {
[s]: 'qwerty123'
};
Символьное свойство объекта добавляется в квадратных скобках для того, чтобы оно не было принято за строковое.
Тут, как я понимаю, и заключается основное назначение символов. Теперь доступ к данному свойству возможен только по ссылке на данный символ:
let secret_key = obj[s]; // 'qwerty123'
По-другому получить доступ мы не сможем:
let secret_key2 = obj['s']; // undefined
let secret_key3 = obj.s; // undefined
Такое свойство не будет видно в for-in
, Object.keys
, Object.getOwnPropertyNames
, а также его не будет и при использовании JSON.stringify
. Таким образом, мы получаем некое подобие приватных свойств объекта. Не совсем, конечно, приватных, ибо есть таки возможность получить все символьные свойства объекта, воспользовавшись Object.getOwnPropertySymbols()
, но очень похоже.
Уникальность символов же позволяет избежать возможного перекрытия свойств объекта. Таким образом, можно дополнять объекты новыми свойствами и не боятся возможного возникновения конфликтов имен.
Помимо пользовательских символов есть ряд системных, таких как Symbol.iterator
или Symbol.replace
. Полный их список можно глянуть в официальной документации Javascript или TypeScript.