Рубрики
Без рубрики

Символы ES6

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

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