Автор оригинала: Scott Robinson.
Вступление
Из всех новых функций в 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
др. Например:
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, верно? Неа. Оказывается, символы были строго понижены из оригинального спецификации (по причинам, неизвестным для меня) и нельзя использовать для надежного создания частных свойств. Символы объекта могут быть доступны через Объект.getownpropertysymbols
Таким образом, заставляя их публики для всех, чтобы увидеть.
var obj = {}; var sym = Symbol(); obj['hi'] = "bye"; obj[sym] = "a"; Object.getOwnPropertySymbols(obj); // Returns [ Symbol() ]
Слово предупреждение, многие люди все еще верят символы JS предоставляют частные свойства объектам, поэтому будьте осторожны, что вы читаете и верите на форумы и переполнение стека. Надеюсь, что заблуждения будут исправлены, как только ES6 станет более мейнстримом.
Вы также можете увидеть много примеров, где символ передается дополнительная строка, как так:
var sym = Symbol("foo");
Этот дескриптор строго используется для целей отладки и не влияет на уникальность символа. Чтобы сделать это более понятно, вот пример:
Symbol("foo") === Symbol("foo"); // Evaluates to false var sym = Symbol("foo"); console.log(sym.toString()); // Prints "Symbol(foo)"
Глобальный спектр
Важно понять, что используя Символ ()
Функция не будет создавать глобальный символ, который доступен в глобальном объеме. Символ остается специфическим для объекта, в котором он используется. Однако вы можете создавать глобальные символы, используя Символ. Для ()
и Symbol.keyforyfor ()
Чтобы получить и установить символы из реестра глобального символа.
Символ. Для (ключ)
Поиск существующих символов с заданным ключом (строкой) и возвращает его, если его найден. Если символ не найден, новый создается в глобальном реестре с данным ключом, а затем возвращено.
Symbol.for("foo"); // Creates a new global symbol var sym = Symbol.for("foo"); // Retrieves the already created symbol
В отличие от Символ ([Описание])
Указание ключа в Символ. Для (ключ)
делает Верните тот же символ каждый раз, так:
Symbol.for("bar") === Symbol.for("bar"); // Evaluates to true Symbol("bar") === Symbol("bar"); // Evaluates to false
Symbol.keyfor (Sym)
по сути напротив Символ. Для (ключ)
вместо того, чтобы пройти ключ, чтобы получить символ, вы передаете символ, чтобы получить ключ.
var sym = Symbol.for("foo"); // Creates new global symbol console.log(Symbol.keyFor(sym)); // Prints "foo"
Заключение
Хотя символы JavaScript являются новыми и некоторые-какие интересные идеи, я скептически относится к своей полезности без гуарентирования частных свойств. Некоторые люди предложили, что они будут хорошими за то, что избежать конфликтов именования, которые могут быть полезны, но я считаю, что их истинный потенциал не будет реализован без предоставления искренне частных свойств. Посмотрим, как вещи прогрессируют с будущими обновлениями.
Что вы думаете о символах? Каким образом вы нашли их полезными? Дайте нам знать об этом в комментариях!