В этом руководстве вы узнаете о символе JavaScript с помощью примеров.
Символ JavaScript
В JavaScript ES6 появился новый примитивный тип данных, называемый Symbol
. Символы неизменяемы (не могут быть изменены) и уникальны. Например,
// two symbols with the same description const value1 = Symbol('hello'); const value2 = Symbol('hello'); console.log(value1 === value2); // false
Хотя value1 и value2 содержат одно и то же описание, они разные.
Создание символа
Вы используете Symbol()
функцию для создания файла Symbol
. Например,
// creating symbol const x = Symbol() typeof x; // symbol
В качестве описания можно передать необязательную строку. Например,
const x = Symbol('hey'); console.log(x); // Symbol(hey)
Символ доступа Описание
Чтобы получить доступ к описанию символа, мы используем .
оператор. Например,
const x = Symbol('hey'); console.log(x.description); // hey
Добавить символ как ключ объекта
Вы можете добавлять символы в качестве ключей к объекту, используя квадратные скобки ()
. Например,
let id = Symbol("id"); let person = ( name: "Jack", // adding symbol as a key (id): 123 // not "id": 123 ); console.log(person); // (name: "Jack", Symbol(id): 123)
Символы не включены в for… in Loop
for… in
Цикл не итерацию над символическими свойствами. Например,
let id = Symbol("id"); let person = ( name: "Jack", age: 25, (id): 12 ); // using for… in for (let key in person) ( console.log(key); )
Вывод
Назовите возраст
Преимущество использования символов в объекте
Если один и тот же фрагмент кода используется в разных программах, то лучше использовать Symbols
в объекте ключ. Это потому, что вы можете использовать одно и то же имя ключа в разных кодах и избежать проблем с дублированием. Например,
let person = ( name: "Jack" ); // creating Symbol let id = Symbol("id"); // adding symbol as a key person(id) = 12;
В приведенной выше программе, если person
объект также используется другой программой, вы не захотите добавлять свойство, которое может быть доступно или изменено другой программой. Следовательно, используя Symbol
, вы создаете уникальное свойство, которое можете использовать.
Теперь, если другой программе также необходимо использовать свойство с именем id , просто добавьте именованный символ, id
и проблем с дублированием не возникнет. Например,
let person = ( name: "Jack" ); let id = Symbol("id"); person(id) = "Another value";
В приведенной выше программе, даже если для хранения значений используется одно и то же имя, Symbol
тип данных будет иметь уникальное значение.
В приведенной выше программе, если использовался строковый ключ, то более поздняя программа изменила бы значение свойства. Например,
let person = ( name: "Jack" ); // using string as key person.id = 12; console.log(person.id); // 12 // Another program overwrites value person.id = 'Another value'; console.log(person.id); // Another value
В приведенной выше программе второе user.id
перезаписывает предыдущее значение.
Символьные методы
В Symbol доступны различные методы.
Метод | Описание |
---|---|
for() | Поиск существующих символов |
keyFor() | Возвращает общий символьный ключ из глобального реестра символов. |
toSource() | Возвращает строку, содержащую источник объекта Symbol |
toString() | Возвращает строку, содержащую описание символа. |
valueOf() | Возвращает примитивное значение объекта Symbol. |
Пример: методы символов
// get symbol by name let sym = Symbol.for('hello'); let sym1 = Symbol.for('id'); // get name by symbol console.log( Symbol.keyFor(sym) ); // hello console.log( Symbol.keyFor(sym1) ); // id
Свойства символа
Свойства | Описание |
---|---|
asyncIterator | Возвращает AsyncIterator по умолчанию для объекта |
hasInstance | Определяет, распознает ли объект-конструктор объект как его экземпляр |
isConcatSpreadable | Указывает, должен ли объект быть сведен к его элементам массива |
iterator | Возвращает итератор по умолчанию для объекта |
match | Соответствует строке |
matchAll | Возвращает итератор, который выдает совпадения регулярного выражения со строкой |
replace | Заменяет совпадающие подстроки строки |
search | Возвращает индекс в строке, которая соответствует регулярному выражению. |
split | Разбивает строку по индексам, соответствующим регулярному выражению |
species | Создает производные объекты |
toPrimitive | Преобразует объект в примитивное значение |
toStringTag | Дает описание объекта по умолчанию |
description | Возвращает строку, содержащую описание символа. |
Пример: пример свойств символа
const x = Symbol('hey'); // description property console.log(x.description); // hey const stringArray = ('a', 'b', 'c'); const numberArray = (1, 2, 3); // isConcatSpreadable property numberArray(Symbol.isConcatSpreadable) = false; let result = stringArray.concat(numberArray); console.log(result); // ("a", "b", "c", (1, 2, 3))