Тип 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.hasInstance
Symbol.iterator
Symbol.toPrimitive
. У них есть свое применение. Эти уникальные переменные мы постепенно представим позже.
Symbol
уникально;Symbol
может добавлять метку и запрашивать сущность объекта в глобальном реестре через метку;Symbol
ключ объекта не может быть обнаружен for … in
;Symbol
. Глобальный объект Symbol
Symbol
полностью скрыт. Мы можем получить все Symbol
объекта через Object.getOwnPropertySymbols(obj)
или получить все ключи объекта через Reflect.ownKeys(obj)
.