Вступление
Из всех новых возможностей ES6 символы могут быть для меня одними из самых интересных. Я никогда не был разработчиком Ruby, поэтому я никогда не видел и не использовал эти примитивные типы на практике. Это интересная концепция, и в этой статье я буду углубляться в самое главное.
Символы ES6
Итак, что же такое символ JavaScript? Это новый уникальный неизменяемый примитивный тип данных, представленный в ES6, изначально предназначенный для предоставления частных свойств.
var sym = Symbol();
typeof sym; // Returns "symbol"
Символы могут использоваться для доступа к свойствам объекта, как и строки:
var obj = {};
var sym = Symbol();
obj[sym] = "a";
console.log(obj[sym]); // Prints "a"
Основное различие здесь заключается в том, что свойство, к которому
обращается sym
, не отображается в объекте, если выполняется итерация,
или если stringify
'd. Например:
var obj = {};
var sym = Symbol();
obj['hi'] = "bye";
obj[sym] = "a";
console.log(obj); // Prints "{hi: 'bye'}"
for (var i in obj) {
console.log(i); // Prints "hi"
}
console.log(JSON.stringify(obj)); // Prints {"hi":"bye"}
Итак, как вы можете видеть, единственный способ получить доступ к
свойству «символизирует» - это использовать исходный объект символа,
иначе вы даже не узнаете, что свойство существует. Это означает, что мы
можем использовать символы, чтобы, наконец, иметь частные свойства в
JavaScript, верно? Неа. Оказывается, символы были сильно понижены по
сравнению с исходной спецификацией (по неизвестным мне причинам) и не
могут использоваться для надежного создания частных свойств. Доступ к
символам объекта можно получить через Object.getOwnPropertySymbols
,
что делает их общедоступными для всеобщего обозрения.
var obj = {};
var sym = Symbol();
obj['hi'] = "bye";
obj[sym] = "a";
Object.getOwnPropertySymbols(obj); // Returns [ Symbol() ]
Предупреждение: многие люди по-прежнему верят, что символы JS предоставляют частные свойства объектам, поэтому будьте осторожны с тем, что вы читаете и чему верите на форумах и в Stack Overflow. Надеюсь, заблуждения будут исправлены, когда ES6 станет более популярным.
Вы также можете увидеть множество примеров, когда символу передается необязательная строка, например:
var sym = Symbol("foo");
Этот дескриптор используется строго для целей отладки и не влияет на уникальность символа. Чтобы прояснить это, вот пример:
Symbol("foo") === Symbol("foo"); // Evaluates to false
var sym = Symbol("foo");
console.log(sym.toString()); // Prints "Symbol(foo)"
Глобальный масштаб
Важно понимать, что использование функции Symbol()
не приведет к
созданию глобального символа, доступного в глобальной области видимости.
Символ остается специфическим для объекта, на котором он используется.
Однако вы можете создавать глобальные символы, используя
Symbol.for()
и
Symbol.keyFor()
чтобы получать и устанавливать символы из глобального реестра символов.
Symbol.for(key)
ищет существующие символы с данным ключом (строкой) и
возвращает его, если он найден. Если символ не найден, в глобальном
реестре создается новый с указанным ключом, а затем возвращается.
Symbol.for("foo"); // Creates a new global symbol
var sym = Symbol.for("foo"); // Retrieves the already created symbol
В отличие от Symbol([description])
, указав ключ в Symbol.for(key)
делает возвращение тот же символ , каждый раз, так что :
Symbol.for("bar") === Symbol.for("bar"); // Evaluates to true
Symbol("bar") === Symbol("bar"); // Evaluates to false
Symbol.keyFor(sym)
по существу противоположен Symbol.for(key)
,
вместо передачи ключа для получения символа вы передаете символ для
получения ключа.
var sym = Symbol.for("foo"); // Creates new global symbol
console.log(Symbol.keyFor(sym)); // Prints "foo"
Заключение
Хотя символы JavaScript - новая и довольно интересная идея, я скептически отношусь к их полезности без гарантии частных свойств. Некоторые люди предположили, что они помогут избежать конфликтов имен, что может быть полезно, но я считаю, что их истинный потенциал не будет реализован без предоставления действительно частных свойств. Посмотрим, как будут дела в будущих обновлениях.
Что вы думаете о символах? В чем вы нашли их полезными? Дайте нам знать об этом в комментариях!