ECMAScript | Ссылочная Запись | Тип спецификации

ECMAScript | Ссылочная Запись | Тип спецификации

Тип Ссылочная Запись (Reference Record) используется для объяснения поведения таких операторов, как delete, typeof, операторов присваивания, ключевого слова super и других языковых функций. Например, ожидается, что левый операнд присваивания создаст Ссылочную Запись.

Ссылочная запись — это разрешенное имя или привязка свойства; его поля определены в Таблице 10.

 

Field Name (Имя поля) Field Name (Значение) Смысл (Meaning)
[[Base]] Один из:
Любое значение языка ECMAScript,
Запись Среды, или
unresolvable.
Значение или Запись Среды, которая содержит привязку. [[Base]] из unresolvable указывает, что привязка не может быть разрешена.
[[ReferencedName]] Строка (String), Знак (Symbol) или Частное Имя (Private Name) Имя привязки. Всегда строка, если значение [[Base]] является Записью Среды.
[[Strict]] Логический (Boolean) Значение true, если ссылочная запись возникла в коде строгого режима, в противном случае — значение false.
[[ThisValue]] Любое значение языка ECMAScript или empty Если не empty, ссылочная запись представляет собой привязку свойства, которая была выражена с помощью ключевого слова super; она называется Супер Ссылочная Запись (Super Reference Record), и ее значение [[Base]] никогда не будет записью среды. В этом случае поле [[ThisValue]] содержит значение this на момент создания Ссылочной Записи.

 

Следующие абстрактные операции используются в этой спецификации для работы со справочными записями:

6.2.4.1 IsPropertyReference ( V )
6.2.4.2 IsUnresolvableReference ( V )
6.2.4.3 IsSuperReference ( V )
6.2.4.4 IsPrivateReference ( V )
6.2.4.5 GetValue ( V )
6.2.4.6 PutValue ( V, W )
6.2.4.7 GetThisValue ( V )
6.2.4.8 InitializeReferencedBinding ( V, W )
6.2.4.9 MakePrivateReference ( baseValue, privateIdentifier )

 

6.2.4.1 IsPropertyReference ( V )

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

1. Если V.[[Base]] является unresolvable (неразрешима), вернуть false.
2. Если V.[[Base]] является Записью Среды, вернуть false; в противном случае верните true.

 

6.2.4.2 IsUnresolvableReference ( V )

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

1. Если V.[[Base]] является unresolvable, вернуть true; в противном случае верните false.

 

6.2.4.3 IsSuperReference ( V )

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

1. Если V.[[ThisValue]] не является empty, вернуть true; в противном случае верните false.

 

6.2.4.4 IsPrivateReference ( V )

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

1. Если V.[[ReferencedName]] является Частным Именем, вернуть true; в противном случае верните false.

 

6.2.4.5 GetValue ( V )

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

1. ReturnIfAbrupt(V).
2. Если V не является Ссылочной Записью, верните V.
3. Если IsUnresolvableReference(V) является true (истинно), выбросить исключение ReferenceError.
4. Если IsPropertyReference(V) является true (истинно), то
   а. Пусть baseObj будет ? ToObject(V.[[Base]]).
   b. Если IsPrivateReference(V) является true (истинно), то
      i. Вернуть ? PrivateGet(V.[[ReferencedName]], baseObj).
   c. Вернуть ? baseObj.[[Get]] (V.[[ReferencedName]], GetThisValue(V)).
5. Иначе,
   а. Пусть base будет V.[[Base]].
   b. Утверждено: base - это Запись Среды.
   c. Вернуть ? base.GetBindingValue(V.[[ReferencedName]], V.[[Strict]]) (смотри раздел 9.1).
Примечание

Объект, который может быть создан на шаге 4.a, недоступен за пределами вышеуказанной абстрактной операции и внутреннего метода [[Get]] обычного объекта. Реализация может решить избежать фактического создания объекта.

 

6.2.4.6 PutValue ( V, W )

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

1. ReturnIfAbrupt(V).
2. ReturnIfAbrupt(W).
3. Если V не является Ссылочной Записью, выбросить исключение ReferenceError.
4. Если IsUnresolvableReference(V) является true (истинно), то
  а. Если V.[[Strict]] является true (истинно), выбросить исключение ReferenceError.
  b. Пусть globalObj будет GetGlobalObject().
  c. Вернуть ? Множество Set(globalObj, V.[[ReferencedName]], W, false).
5. Если IsPropertyReference(V) является true (истинно), то
  а. Пусть baseObj будет ? ToObject(V.[[Base]]).
  b. Если IsPrivateReference(V) является true (истинно), то
    i. Вернуть ? PrivateSet(V.[[ReferencedName]], baseObj, W).
  c. Пусть succeeded будет ? baseObj.[[Set]](V.[[ReferencedName]], W, GetThisValue(V)).
  d. Если succeeded является false, а V.[[Strict]] является true (истинно), выбросить исключение TypeError.
  e. Вернуть.
6. Иначе,
  а. Пусть base будет V.[[Base]].
  b. Утверждено: base - это Запись Среды.
  c. Вернуть ? base.SetMutableBinding(V.[[ReferencedName]], W, V. [[Strict]]) (смотри раздел 9.1).
Примечание

Объект, который может быть создан на шаге 5.a, недоступен за пределами вышеуказанной абстрактной операции и внутреннего метода [[Set]] обычного объекта. Реализация может решить избежать фактического создания этого объекта.

 

6.2.4.7 GetThisValue ( V )

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

1. Утверждено: IsPropertyReference(V) является true (истинно).
2. Если IsSuperReference(V) является true (истинно), вернуть V.[[ThisValue]]; в противном случае верните V.[[Base]].

 

6.2.4.8 InitializeReferencedBinding ( V, W )

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

1. ReturnIfAbrupt(V).
2. ReturnIfAbrupt(W).
3. Утверждено: V является Ссылочной Записью.
4. Утверждено: IsUnresolvableReference(V) является false (ложно).
5. Пусть base будет V.[[Base]].
6. Утверждено: base является Записью Среды.
7. Вернуть base.InitializeBinding(V.[[ReferencedName]], W).

 

 

6.2.4.9 MakePrivateReference ( baseValue, privateIdentifier )

Абстрактная операция MakePrivateReference принимает аргументы baseValue (значение языка ECMAScript) и privateIdentifier (String). При вызове он выполняет следующие шаги:

1. Пусть privEnv будет PrivateEnvironment текущего контекста выполнения.
2. Утверждено: privEnv не равен null.
3. Пусть privateName будет ! ResolvePrivateIdentifier(privEnv, privateIdentifier).
4. Верните Ссылочную Запись {[[Base]]: baseValue, [[ReferencedName]]: privateName, [[Strict]]: true, [[ThisValue]]: empty} ".

 

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

Стандарт ECMAScript — Раздел «6.2.4 The Reference Record Specification Type» — https://tc39.es/ecma262/#sec-reference-record-specification-type