ECMAScript | Знаки (Symbol)

ECMAScript | Знаки (Symbol)

20.4.1 Конструктор Знака (Symbol)

Конструктор Знака (Symbol):

  • является %Symbol%.
  • имеет начальное значение свойства «Symbol» глобального объекта.
  • возвращает новое значение Знака при вызове как функции.
  • не предназначен для использования с оператором new.
  • не предназначен для разделения на подклассы.
  • может использоваться как значение предложения extends определения класса, но его вызов super вызовет исключение.

 

20.4.1.1 Symbol ( [ description ] )

Когда Symbol вызывается с необязательным аргументом description, выполняются следующие шаги:

1. Если NewTarget не является undefined (неопределенным), выбросить исключение TypeError.
2. Если описание description является undefined, пусть descString будет undefined.
3. Иначе пусть descString будет ? ToString(description).
4. Верните новое уникальное значение Знака, значение [[Description]] которого равно descString.

 

20.4.2 Свойства конструктора Знака (Symbol)

Конструктор Знака (Symbol):

  • имеет внутренний слот [[Prototype]], значение которого — %Function.prototype%.
  • обладает следующими свойствами:
20.4.2.1 Symbol.asyncIterator
20.4.2.2 Symbol.for ( key )
20.4.2.3 Symbol.hasInstance
20.4.2.4 Symbol.isConcatSpreadable
20.4.2.5 Symbol.iterator
20.4.2.6 Symbol.keyFor ( sym )
20.4.2.7 Symbol.match
20.4.2.8 Symbol.matchAll
20.4.2.9 Symbol.prototype
20.4.2.10 Symbol.replace
20.4.2.11 Symbol.search
20.4.2.12 Symbol.species
20.4.2.13 Symbol.split
20.4.2.14 Symbol.toPrimitive
20.4.2.15 Symbol.toStringTag
20.4.2.16 Symbol.unscopables

 

20.4.2.1 Symbol.asyncIterator

Начальным значением Symbol.asyncIterator является хорошо известный символ @@asyncIterator (Таблица 1).

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

 

20.4.2.2 Symbol.for ( key )

Когда Symbol.for вызывается с аргументом key, она выполняет следующие шаги:

1. Пусть stringKey будет ? ToString(key).
2. Для каждого элемента e списка GlobalSymbolRegistry Списка выполните
а. Если SameValue(e.[[Key]], stringKey) является true, вернуть e.[[Symbol]].
3. Утверждено: GlobalSymbolRegistry в настоящее время не содержит записи для stringKey.
4. Пусть newSymbol будет новым уникальным значением знака Symbol, значение [[Description]] которого равно stringKey.
5. Добавьте Запись {[[Key]]: stringKey, [[Symbol]]: newSymbol} в Список GlobalSymbolRegistry.
6. Верните newSymbol.

GlobalSymbolRegistry — это Список, доступный глобально (во всем мире). Его разделяют все области. Перед оценкой любого кода ECMAScript он инициализируется как новый пустой Список. Элементами GlobalSymbolRegistry являются записи со структурой, определенной в таблице 64.

Field Name (Имя поля) Value (Значение) Usage (Использование)
[[Key]] Строка String Строковый ключ, используемый для глобальной идентификации Знака.
[[Symbol]] Знак Symbol Знак, который можно получить из любой области.

 

20.4.2.3 Symbol.hasInstance

Начальным значением Symbol.hasInstance является хорошо известный символ @@hasInstance (Таблица 1).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.2.4 Symbol.isConcatSpreadable

Начальным значением Symbol.isConcatSpreadable является хорошо известный символ @@isConcatSpreadable (Таблица 1).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.2.5 Symbol.iterator

Начальным значением Symbol.iterator является хорошо известный символ @@iterator (Таблица 1).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.2.6 Symbol.keyFor ( sym )

Когда Symbol.keyFor вызывается с аргументом sym, он выполняет следующие шаги:

1. Если Тип(sym) не является Знаком (Symbol), выбросить исключение TypeError.
2. Для каждого элемента e Списка GlobalSymbolRegistry (см. 20.4.2.2) выполните
   а. Если SameValue(e.[[Symbol]], sym) является true, вернуть e.[[Key]].
3. Утверждено: GlobalSymbolRegistry в настоящее время не содержит записи для sym.
4. Вернуть undefined.

 

20.4.2.7 Symbol.match

Начальным значением Symbol.match является хорошо известный символ @@match (Таблица 1).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.2.8 Symbol.matchAll

Начальным значением Symbol.matchAll является хорошо известный символ @@matchAll (Таблица 1).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.2.9 Symbol.prototype

Начальным значением Symbol.prototype является объект-прототип Symbol.

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.2.10 Symbol.replace

Начальным значением Symbol.replace является хорошо известный символ @@replace (Таблица 1).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.2.11 Symbol.search

Начальным значением Symbol.search является хорошо известный символ @@search (Таблица 1).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.2.12 Symbol.species

Начальным значением Symbol.species является хорошо известный символ @@pecies (Таблица 1).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.2.13 Symbol.split

Начальным значением Symbol.split является хорошо известный символ @@split (Таблица 1).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.2.14 Symbol.toPrimitive

Начальным значением Symbol.toPrimitive является хорошо известный символ @@toPrimitive (Таблица 1).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.2.15 Symbol.toStringTag

Начальным значением Symbol.toStringTag является хорошо известный символ @@toStringTag (Таблица 1).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.2.16 Symbol.unscopables

Начальным значением Symbol.unscopables является хорошо известный символ @@unscopables (Таблица 1).

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

 

20.4.3 Свойства объекта прототипа Знака

Объект-прототип Знака (Symbol prototype object):

  • это %Symbol.prototype%.
  • это обычный объект.
  • не является экземпляром символа и не имеет внутреннего слота [[SymbolData]].
  • имеет внутренний слот [[Prototype]], значение которого %Object.prototype%.

Абстрактная операция thisSymbolValue принимает аргумент value. При вызове она выполняет следующие шаги:

1. Если Тип(value) - это Знак, вернуть value.
2. Если Тип(value) - это Объект, а value имеет внутренний слот [[SymbolData]], тогда
  а. Пусть s будет value.[[SymbolData]].
  b. Утверждено: Тип(ы) - это Знак.
  c. Вернуть s.
3. Выбросить исключение TypeError.
20.4.3.1 Symbol.prototype.constructor
20.4.3.2 get Symbol.prototype.description
20.4.3.3 Symbol.prototype.toString ( )
20.4.3.4 Symbol.prototype.valueOf ( )
20.4.3.5 Symbol.prototype [ @@toPrimitive ] ( hint )
20.4.3.6 Symbol.prototype [ @@toStringTag ]

 

20.4.3.1 Symbol.prototype.constructor

Начальное значение Symbol.prototype.constructor%Symbol%.

 

20.4.3.2 get Symbol.prototype.description

Symbol.prototype.description — это свойство доступа, для которого функция доступа set не определена (является undefined). Его функция доступа get выполняет следующие шаги:

1. Пусть s будет значением this.
2. Пусть sym будет ? thisSymbolValue(s).
3. Вернуть sym.[[Description]].

 

20.4.3.3 Symbol.prototype.toString ( )

Выполняются следующие шаги:

1. Пусть sym будет ? thisSymbolValue(значение this).
2. Вернуть SymbolDescriptiveString(sym).

 

20.4.3.3.1 SymbolDescriptiveString ( sym )

Абстрактная операция SymbolDescriptiveString принимает аргумент sym (Знак). При вызове она выполняет следующие шаги:

1. Пусть desc будет значением [[Description]] знака sym.
2. Если desc не определено (является undefined), установите для desc пустую Строку.
3. Утверждено: Тип(desc) является Строкой.
4. Верните конкатенацию строк из "Symbol(", desc и ")".

 

20.4.3.4 Symbol.prototype.valueOf ( )

Выполняются следующие шаги:

1. Вернуть ? thisSymbolValue(значение this).

 

20.4.3.5 Symbol.prototype [ @@toPrimitive ] ( hint )

Эта функция вызывается операторами языка ECMAScript для преобразования объекта Symbol в примитивное значение.

Когда метод @@toPrimitive вызывается с аргументом подсказки hint, выполняются следующие шаги:

1. Вернуть ? thisSymbolValue(значение this).

Значение свойства «name» этой функции — "[Symbol.toPrimitive]".

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}.

Примечание

Аргумент игнорируется.

 

20.4.3.6 Symbol.prototype [ @@toStringTag ]

Начальным значением свойства @@toStringTag является строковое значение «Symbol».

Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}.

 

20.4.4 Свойства экземпляров Знака (Symbol)

Экземпляры Знаков — это обычные объекты, наследующие свойства от объекта-прототипа Symbol. Экземпляры символов имеют внутренний слот [[SymbolData]]. Внутренний слот [[SymbolData]] — это значение Знака, представленное этим объектом Знака.

 

Информационные ссылки

Стандарт ECMAScript — Раздел «20.4 Symbol Objects» — https://tc39.es/ecma262/#sec-symbol-objects