
Тип Symbol — это особый тип в JavaScript . В частности, все значения типа Symbol отличаются друг от друга. Мы можем использовать «Символ» для представления уникального значения. Ниже приведен пример создания объекта Symbol :
let id = Символ().
Таким образом, мы создаем значение типа Symbol и сохраняем это значение в переменной id .
Когда мы создаем переменную типа Symbol , мы можем передать в параметрах несколько строк с атрибутами секунд, чтобы описать назначение этой переменной.
Например:
let id1 = Символ('Идентификатор Сяо Мина, сумасшедшего и крутого');
let id2 = Символ('Сдержанный, роскошный и коннотативный идентификатор Tingting'); Типы Symbol могут быть разными в любое время, даже если они имеют одинаковую информацию описания, описание является просто меткой и не имеет никакой другой цели. Например:
let id1 = Символ('id');
пусть id2 = Символ('id');
console.log(id1==id2);// Значение ложной метки, я лично думаю, связано с тем, что Symbol не может интуитивно видеть внутреннее конкретное значение. Добавляя информацию описания, мы можем получить более интуитивное представление. понимание использования переменных.
Большинство типов в JavaScript можно напрямую преобразовать в строковый тип для вывода, поэтому мы не можем интуитивно увидеть его значение. Например, мы можем напрямую использовать alert(123) для преобразования числа 123 Преобразовать в строковое всплывающее окно.
Однако тип Symbol является особенным и не может быть преобразован напрямую, например:
let id = символ(); alert(id);//Отчет об ошибке: тип символа не может быть преобразован
в строку. Тип Symbol в JavaScript не может быть преобразован в строку из-за встроенного в него механизма «защиты языка», позволяющего предотвратить путаницу языков, поскольку строки и Symbol не могут быть преобразованы в строку. принципиально разные. Разница есть и одно не надо превращать в другое.
Представьте себе, если Symbol можно преобразовать в строку, то он становится функцией, генерирующей уникальную строку, и нет необходимости в независимом типе данных.
Если мы действительно хотим узнать значение переменной Symbol , мы можем использовать метод .toString() следующим образом:
let id = Символ('это идентификация');
console.log(id.toString());//Symbol(это идентификация); Или используйте атрибут .description , чтобы получить информацию описания:
let id = Символ('Давай, дай мне Оли');
console.log(id.description);//Да ладно, Олли» Согласно спецификациям JavaScript , в качестве ключей свойств объекта можно использовать только два типа значений:
. используются другие типы. Он будет неявно преобразован в строковый тип. Ключ объекта подробно описан в предыдущей главе и не будет повторяться здесь.
Существует два Symbol
Пример 1:
let id = Символ('id');
пусть пользователь = {};
user[id] = 'id value';//Добавьте ключ символа console.log(user[id]);//id value Пример 2:
let id = Символ('id');
пусть пользователь = {
[id]:'id value',//обратите внимание на квадратные скобки здесь
};
console.log(user[id]); В двух приведенных выше случаях показано использование вставки типа Symbol в качестве ключа в объект. Следует отметить, что при доступе к атрибуту необходимо использовать obj[id] вместо obj.id , потому что obj.id представляет obj['id'] .
Что произойдет, если мы используем Symbol в качестве ключа объекта?
Symbol in for...in заключается в том, что если объект использует Symbol в качестве ключа, то к свойствам типа Symbol невозможно получить доступ с помощью оператора for…in .
Например:
пусть id = Символ('id');
пусть пользователь = {
имя: «Сяомин»,
[я сделал',
};
for (let key in user) console.log(user[key]); Выполните приведенный выше код и получите следующие результаты:
> Xiaomiing
может обнаружить, что значение объекта [id] не распечатано, что указывает на то, что в объекте список атрибутов, использование for … in автоматически игнорирует ключи типа Symbol .
Аналогично, Object.keys(user) будет игнорировать все ключи типа Symbol .
Эта функция может принести очень полезные эффекты, например, мы можем создавать свойства, которые можем использовать только мы.
Хотя у нас нет возможности напрямую получить ключ Symbol , метод Object.assign может скопировать все свойства:
пусть id = символ();
пусть объект = {
[идентификатор]: '123'
}
пусть obj2 = Object.assign({},obj);
console.log(obj2[id]); Это не влияет на скрытые свойства Symbol , поскольку скопированный объект по-прежнему не может получить ключ Symbol .
Поскольку Symbol невозможно преобразовать в строку напрямую, у нас нет возможности получить его значение интуитивно, а также мы не можем получить атрибут объекта Symbol через for … in Другими словами, без самой переменной Symbol , у нас нет возможности получить соответствующие свойства внутри объекта.
Следовательно, через значение ключа типа Symbol мы можем скрыть свойства. Доступ к этим свойствам возможен только нам самим, и никто другой не сможет увидеть наши свойства.
Например:
в процессе разработки нам нужно сотрудничать с нашим коллегой «Чжан Сан», и этот Чжан Сан создал очень простой в использовании Tool . Tool — это тип объекта. Мы хотим использовать Tool Чжан Саня бесплатно. и на основе этого добавьте несколько своих собственных свойств.
Мы можем добавить ключ типа Symbol :
lettool = {//Tool, написанный Чжан Санем.
использование: "Могу сделать что угодно",
}
let name = Символ("Мой инструмент obj");
инструмент[имя] = "Это мой инструмент";
console.log(tool[name]); В приведенном выше примере показано, как добавить свои собственные свойства к объекту, написанному другими, так зачем использовать тип Symbol вместо обычной строки?
Причины следующие:
tool — это код, написанный другими. В принципе, нам не следует изменять чужой код, так как это вызовет риски,Symbol , Symbol чтоSymbol , а это означает, что они не будут конфликтовать сдемонстрацией ошибок других людей:
Если мы не используем тип Symbol , вероятно, произойдет следующая ситуация:
пусть инструмент = {//Инструмент, написанный Чжан Санем.
использование: "Могу сделать что угодно",
}
tool.usage = "Бум-Бум";
console.log(tool.usage); Приведенный выше код повторно использует «использование» и, таким образом, переписывает исходные атрибуты, что приведет к ненормальной работе исходной функции объекта.
Все переменные Symbol различны, даже если они имеют одинаковую метку (описание).
Иногда нам нужно получить доступ к одному и тому же объекту Symbol через строковое имя (метку), например, мы обращаемся к одному и тому же Symbol в разных местах кода.
JavaScript поддерживает глобальный реестр Symbol . Мы можем получить доступ к объекту, вставив объект Symbol в реестр и присвоив ему строковое имя.
Чтобы вставить или прочитать объект Symbol в реестр, вам необходимо использовать метод Symbol.for(key) . Если в реестре есть объект с именем key , объект будет возвращен. В противном случае будет вставлен новый объект. вернулся.
Например:
let id1 = Символ.for('id');//В реестре нет символа с именем id, создайте и верните let id2 = Символ.for('id');//Символ с именем уже существует id в реестре. Для символа с id напрямую верните console.log(id1===id2);//true. Через Symbol.for(key) мы можем использовать объект Symbol в качестве глобальной переменной и использовать строку для отметьте название объекта.
Напротив, мы также можем использовать Symbol.keyFor(Symbol) чтобы получить имя объекта в обратном порядке.
Например:
let id = Symbol.for('id');//В реестре нет символа с именем id, создайте и верните let name = Symbol.keyFor(id);
console.log(name);//id Функция Symbol.keyFor() может использоваться только с глобальными объектами Symbol (объекты, вставленные с помощью Symbol.for ). Если она используется с неглобальными объектами, она вернет undefined .
Например:
let id = Символ('id');//локальный символ
пусть имя = Символ.keyFor(id);
console.log(name);//неопределенный JavaScript имеется множество системных Symbol , например:
Symbol.hasInstanceSymbol.iteratorSymbol.toPrimitive. У них есть свое применение. Эти уникальные переменные мы постепенно представим позже.
Symbol уникально;Symbol может добавлять метку и запрашивать сущность объекта в глобальном реестре через метку;Symbol ключ объекта не может быть обнаружен for … in ;Symbol . Глобальный объект SymbolSymbol полностью скрыт. Мы можем получить все Symbol объекта через Object.getOwnPropertySymbols(obj) или получить все ключи объекта через Reflect.ownKeys(obj) .