Символ в Javascript

Знакомство с символами: уникальный тип данных для свойств объектов

Tom Машинопись и JavaScript, Руководства по кодированию, Обучение

В JavaScript символы — это уникальные типы данных, которые можно использовать для создания идентификаторов свойств объекта. Символы не похожи на строки или числа, и их нельзя преобразовать в эти типы данных. Именно это делает их идеальными для создания идентификаторов.

Использование символов в Javascript

Когда вы создаете символ, вы можете дополнительно дать ему описание. Это полезно для отладки, но не обязательно.

Создать символ просто.

const mySymbol = Symbol();

javascriptLanguageCheck out all coding posts

Вы также можете создать символ с описанием.

const mySymbol = Symbol("my description");

javascriptLanguageCheck out all coding posts

Если вы создадите несколько символов с одним и тем же описанием, они будут иметь разные значения.

const sym1 = Symbol("foo");
const sym2 = Symbol("foo");

// false
console.log(sym1 === sym2);

javascriptLanguageCheck out all coding posts

Что делает символы уникальными

Символы часто используются в качестве идентификаторов свойств объекта. Это связано с тем, что символы гарантированно уникальны и не преобразуются в строки.

const obj = {};
obj[mySymbol] = "bar";

// "bar"
console.log(obj[mySymbol]);

javascriptLanguageCheck out all coding posts

Вы можете использовать символы в качестве ключей для свойств объекта, но не можете использовать их в качестве имен свойств (ключей) в JSON.

const sym = Symbol("foo");
const obj = { [sym]: "bar" };

// {}
console.log(JSON.stringify(obj));

javascriptLanguageCheck out all coding posts

Символы не являются перечисляемыми, поэтому они не будут отображаться, когда вы используете цикл for-in для объекта.

const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";

for (var key in obj) {
  // undefined
  console.log(key);
}

javascriptLanguageCheck out all coding posts

Вы можете использовать Object.getOwnPropertySymbols, чтобы получить массив всех символов объекта.

const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";

const symbols = Object.getOwnPropertySymbols(obj);

// [Symbol(a), Symbol(b)]
console.log(symbols);

javascriptLanguageCheck out all coding posts

Использование символа в качестве итератора

Вы можете использовать известный Symbol.iterator, чтобы получить символ, который можно использовать в качестве итератора.

const arr = [1, 2, 3];
const it = arr[Symbol.iterator]();

// { value: 1, done: false }
console.log(it.next());

// { value: 2, done: false }
console.log(it.next());

// { value: 3, done: false }
console.log(it.next()); 

// { value: undefined, done: true }
console.log(it.next());

javascriptLanguageCheck out all coding posts

Более реальный пример

Вы можете создавать свои собственные символы, но нет никакой гарантии, что они будут уникальными. Если вам нужен уникальный символ, вы должны использовать Symbol().

Предположим, у вас есть объект, представляющий человека. Вы хотите добавить свойство к этому объекту, в котором хранится год рождения человека, но вы не хотите, чтобы это свойство было перечисляемым. Вы можете сделать это с помощью символа:

const person = {
  name: "John Doe"
};
const birthYear = Symbol("birth year");
person[birthYear] = "1955";

for (var key in person) {
  // name
  console.log(key); 
}

// 1955
console.log(person[birthYear]);

javascriptLanguageCheck out all coding posts

Действия

Feedback

Предлагаемые сообщения