Тип Ссылочная Запись (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