Символы ES6

Введение Из всех новых возможностей ES6, символы [http://en.wikipedia.org/wiki/Symbol_%28programming%29] могут быть для меня одними из самых интересных. Я никогда не был разработчиком Ruby, поэтому я никогда не видел и не использовал эти примитивные типы на практике. Это интересная концепция, и в этой статье я буду углубляться в самое главное. Символы ES6 Итак, что же такое символ JavaScript? Это новый уникальный, неизменный, примитивный тип данных, представленный в ES6, изначально предназначенный для предоставления

Вступление

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

Что вы думаете о символах? В чем вы нашли их полезными? Дайте нам знать об этом в комментариях!

comments powered by Disqus