ECMAScript | Операторы Присваивания (Assignment Operators)

ECMAScript | Операторы Присваивания (Assignment Operators)

Синтаксис операторов присваивания

AssignmentExpression [In, Yield, Await] :

ConditionalExpression [?In, ?Yield, ?Await]

[+Yield] YieldExpression [?In, ?Await]

ArrowFunction [?In, ?Yield, ?Await]

AsyncArrowFunction [?In, ?Yield, ?Await]

LeftHandSideExpression [?Yield, ?Await] = AssignmentExpression [?In, ?Yield, ?Await]

LeftHandSideExpression [?Yield, ?Await] AssignmentOperator AssignmentExpression [?In, ?Yield, ?Await]

LeftHandSideExpression [?Yield, ?Await] &&= AssignmentExpression [?In, ?Yield, ?Await]

LeftHandSideExpression [?Yield, ?Await] ||= AssignmentExpression [?In, ?Yield, ?Await]

LeftHandSideExpression [?Yield, ?Await] ??= AssignmentExpression [?In, ?Yield, ?Await]

 

AssignmentOperator : один из

*=

/=

%=

+=

-=

<<=

>>=

>>>=

&=

^=

|=

**=

 

Статическая семантика: Ранние Ошибки

AssignmentExpression : LeftHandSideExpression = AssignmentExpression

Если LeftHandSideExpression является ObjectLiteral или ArrayLiteral, применяются следующие правила Ранней Ошибки (Early Error):

Если LeftHandSideExpression не является ни ObjectLiteral, ни ArrayLiteral, применяется следующее правило ранней ошибки:

AssignmentExpression (Выражение присвоения) :

LeftHandSideExpression AssignmentOperator AssignmentExpression (Выражение присвоения)

LeftHandSideExpression &&= AssignmentExpression (Выражение присвоения)

LeftHandSideExpression ||= AssignmentExpression (Выражение присвоения)

LeftHandSideExpression ??= AssignmentExpression (Выражение присвоения)

 

Семантика времени выполнения: Оценка

AssignmentExpression : LeftHandSideExpression = AssignmentExpression

1. Если LeftHandSideExpression не является ни ObjectLiteral, ни ArrayLiteral, тогда
   а. Пусть lref будет результатом вычисления LeftHandSideExpression.
   b. Выполнить ReturnIfAbrupt(lref).
   c. Если IsAnonymousFunctionDefinition(AssignmentExpression) и IsIdentifierRef из LeftHandSideExpression истинны true, то
      i. Пусть rval будет NamedEvaluation выражения AssignmentExpression с аргументом lref.[[ReferencedName]].
   d. Иначе,
      i. Пусть rref будет результатом вычисления AssignmentExpression.
      ii. Пусть rval будет ? GetValue(rref).
   е. Выполнить ? PutValue(lref, rval).
   f. Вернуть rval.
2. Пусть assignmentPattern будет AssignmentPattern, который покрывается LeftHandSideExpression.
3. Пусть rref будет результатом вычисления AssignmentExpression.
4. Пусть rval будет ? GetValue(rref).
5. Выполнить ? DestructuringAssignmentEvaluation из assignmentPattern с использованием rval в качестве аргумента.
6. Вернуть rval.

AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression

1. Пусть lref будет результатом вычисления LeftHandSideExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть rref будет результатом вычисления AssignmentExpression.
4. Пусть rval будет? GetValue(rref).
5. Пусть assignmentOpText будет исходным текстом, сопоставленным AssignmentOperator.
6. Пусть opText будет последовательностью кодовых точек Unicode, связанных с assignmentOpText в следующей таблице.

Таблица

assignmentOpText opText
**= **
*= *
/= /
%= %
+= +
-=
<<= <<
>>= >>
>>>= >>>
&= &
^= ^
|= |
7. Пусть r будет ApplyStringOrNumericBinaryOperator(lval, opText, rval).
8. Выполнить ? PutValue(lref, r).
9. Вернуть r.

 

AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression

1. Пусть lref будет результатом вычисления LeftHandSideExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть lbool будет ! ToBoolean(lval).
4. Если lbool ложно - является false, вернуть lval.
5. Если IsAnonymousFunctionDefinition(AssignmentExpression) истинно - является true, а IsIdentifierRef для LeftHandSideExpression истинно - является true, то
   а. Пусть rval будет NamedEvaluation из AssignmentExpression с аргументом lref.[[ReferencedName]].
6. Иначе,
   а. Пусть rref будет результатом вычисления AssignmentExpression.
   b. Пусть rval будет ? GetValue(rref).
7. Выполнить ? PutValue(lref, rval).
8. Вернуть rval.

 

AssignmentExpression : LeftHandSideExpression ||= AssignmentExpression

1. Пусть lref будет результатом вычисления LeftHandSideExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть lbool будет ! ToBoolean(lval).
4. Если lbool ложно - является true, вернуть lval.
5. Если IsAnonymousFunctionDefinition(AssignmentExpression) истинно - является true, а IsIdentifierRef для LeftHandSideExpression истинно - является true, то
   а. Пусть rval будет NamedEvaluation из AssignmentExpression с аргументом lref.[[ReferencedName]].
6. Иначе,
   а. Пусть rref будет результатом вычисления AssignmentExpression.
   b. Пусть rval будет ? GetValue(rref).
7. Выполнить ? PutValue(lref, rval).
8. Вернуть rval.

 

AssignmentExpression : LeftHandSideExpression ??= AssignmentExpression

1. Пусть lref будет результатом вычисления LeftHandSideExpression.
2. Пусть lval будет ? GetValue(lref).
3. Если lval не является ни undefined, ни null, вернуть lval.
4. Если IsAnonymousFunctionDefinition(AssignmentExpression) истинно - является true, а IsIdentifierRef для LeftHandSideExpression истинно - является true, то
   а. Пусть rval будет NamedEvaluation из AssignmentExpression с аргументом lref.[[ReferencedName]].
5. Иначе,
   а. Пусть rref будет результатом вычисления AssignmentExpression.
   b. Пусть rval будет ? GetValue(rref).
6. Выполнить ? PutValue(lref, rval).
7. Вернуть rval.

 

Примечание

Когда это выражение встречается в «коде строгого режима» (strict mode code), это ошибка времени выполнения, если lref на шаге 1.e, 2, 2, 2, 2 является неразрешимой ссылкой. Если это так, генерируется исключение ReferenceError. Кроме того, это ошибка времени выполнения, если lref на шагах 8, 7, 7, 6 является ссылкой на свойство данных со значением атрибута {[[Writable]]: false}, на свойство средства доступа со значением атрибута {[ [Set]]: undefined}, или несуществующему свойству объекта, для которого предикат IsExtensible возвращает значение false. В этих случаях возникает исключение TypeError.

 

 

ApplyStringOrNumericBinaryOperator ( lval, opText, rval )

Абстрактная операция ApplyStringOrNumericBinaryOperator (Применить строковый или числовой двоичный оператор) принимает аргументы lval (значение языка ECMAScript), opText (последовательность кодовых точек Unicode) и rval (значение языка ECMAScript). При вызове она выполняет следующие шаги:

1. Утверждено: opText присутствует в таблице на шаге 8.
2. Если opText равен +, тогда
   а. Пусть lprim будет ? ToPrimitive(lval).
   b. Пусть rprim будет ? ToPrimitive(rval).
   c. Если Type(lprim) является String или Type(rprim) является String, то
      i. Пусть lstr будет ? ToString(lprim).
      ii. Пусть rstr будет ? ToString(rprim).
      iii. Вернуть конкатенацию строк lstr и rstr.
   d. Установите lval на lprim.
   е. Установите rval на rprim.
3. ПРИМЕЧАНИЕ. На этом этапе это должна быть числовая операция.
4. Пусть lnum будет ? ToNumeric(lval).
5. Пусть rnum будет ? ToNumeric(rval).
6. Если Type(lnum) отличается от Type(rnum), выбросить исключение TypeError.
7. Пусть T будет Type(lnum).
8. Пусть операция operation будет абстрактной операцией, связанной с opText в следующей таблице:

Таблица

opText operation
** T::exponentiate
* T::multiply
/ T::divide
% T::remainder
+ T::add
- T::subtract
<< T::leftShift
>> T::signedRightShift
>>> T::unsignedRightShift
& T::bitwiseAND
^ T::bitwiseXOR
| T::bitwiseOR
9. Вернуть ? operation(lnum, rnum).
Примечание 1

В вызовах ToPrimitive на шагах 2.a и 2.b подсказка не дается. Все стандартные объекты, кроме объектов Date, обрабатывают отсутствие подсказки, как если бы было задано число — number; Объекты Date обрабатывают отсутствие подсказки, как если бы была дана строка — string. Экзотические предметы могут справиться с отсутствием подсказки иным образом.

Примечание 2

Шаг 2.c отличается от шага 3 алгоритма Абстрактного Реляционного Сравнения использованием операции «логического ИЛИ» (logical-or) вместо операции «логического И» (logical-and).

 

EvaluateStringOrNumericBinaryExpression ( leftOperand, opText, rightOperand )

Абстрактная операция EvaluateStringOrNumericBinaryExpression (Вычислить строку или числовое двоичное выражение) принимает аргументы leftOperand (узел синтаксического анализа), opText (последовательность кодовых точек Unicode) и rightOperand (узел синтаксического анализа). При вызове она выполняет следующие шаги:

1. Пусть lref будет результатом вычисления leftOperand.
2. Пусть lval будет ? GetValue(lref).
3. Пусть rref будет результатом вычисления rightOperand.
4. Пусть rval будет ? GetValue(rref).
5. Вернуть ? ApplyStringOrNumericBinaryOperator(lval, opText, rval).

 

Деструктурирующее присвоение

Дополнительный синтаксис

При определенных обстоятельствах при обработке экземпляра продукции

AssignmentExpression : LeftHandSideExpression = AssignmentExpression

интерпретация LeftHandSideExpression уточняется с использованием следующей грамматики:

 

AssignmentPattern [Yield, Await] :

ObjectAssignmentPattern [?Yield, ?Await]

ArrayAssignmentPattern [?Yield, ?Await]

 

ObjectAssignmentPattern [Yield, Await] :

{ }

{ AssignmentRestProperty [?Yield, ?Await] }

{ AssignmentPropertyList [?Yield, ?Await] }

{ AssignmentPropertyList [?Yield, ?Await] , AssignmentRestProperty [?Yield, ?Await] opt }

 

ArrayAssignmentPattern [Yield, Await] :

[ Elision opt AssignmentRestElement [?Yield, ?Await] opt ]

[ AssignmentElementList [?Yield, ?Await] ]

[ AssignmentElementList [?Yield, ?Await] , Elision opt AssignmentRestElement [?Yield, ?Await] opt ]

 

AssignmentRestProperty [Yield, Await] :

 DestructuringAssignmentTarget [?Yield, ?Await]

 

AssignmentPropertyList [Yield, Await] :

AssignmentProperty [?Yield, ?Await]

AssignmentPropertyList [?Yield, ?Await] , AssignmentProperty [?Yield, ?Await]

 

AssignmentElementList [Yield, Await] :

AssignmentElisionElement [?Yield, ?Await]

AssignmentElementList [?Yield, ?Await] , AssignmentElisionElement [?Yield, ?Await]

 

AssignmentElisionElement [Yield, Await] :

Elision opt AssignmentElement [?Yield, ?Await]

 

AssignmentProperty [Yield, Await] :

IdentifierReference [?Yield, ?Await] Initializer [+In, ?Yield, ?Await] opt

PropertyName [?Yield, ?Await] : AssignmentElement [?Yield, ?Await]

 

AssignmentElement [Yield, Await] :

DestructuringAssignmentTarget [?Yield, ?Await] Initializer [+In, ?Yield, ?Await] opt

 

AssignmentRestElement [Yield, Await] :

 DestructuringAssignmentTarget [?Yield, ?Await]

 

DestructuringAssignmentTarget [Yield, Await] :

LeftHandSideExpression [?Yield, ?Await]

 

Статическая семантика: ранние ошибки

AssignmentProperty : IdentifierReference Initializer opt

 

AssignmentRestProperty :  DestructuringAssignmentTarget

 

DestructuringAssignmentTarget : LeftHandSideExpression

Если LeftHandSideExpression является ObjectLiteral или ArrayLiteral, применяются следующие правила Ранней Ошибки:

Если LeftHandSideExpression не является ни ObjectLiteral, ни ArrayLiteral, применяется следующее правило ранней ошибки:

 

Семантика времени выполнения: деструктуризация оценки присвоения — DestructuringAssignmentEvaluation

С параметром value

ObjectAssignmentPattern : { }

 ? RequireObjectCoercible(value).
Вернуть NormalCompletion(empty).

 

ObjectAssignmentPattern :

{ AssignmentPropertyList }

{ AssignmentPropertyList , }

Выполнить ? RequireObjectCoercible(value).
Выполнить ? PropertyDestructuringAssignmentEvaluation для AssignmentPropertyList используя value в качестве аргумента.
Вернуть NormalCompletion(empty).

 

ArrayAssignmentPattern : [ ]

Пусть iteratorRecord будет ? GetIterator(value).
Вернуть ? IteratorClose(iteratorRecordNormalCompletion(empty)).

 

ArrayAssignmentPattern : [ Elision ]

Пусть iteratorRecord будет ? GetIterator(value).
Пусть result будет IteratorDestructuringAssignmentEvaluation из Elision с аргументом iteratorRecord.
Если iteratorRecord.[[Done]] является false, вернуть ? IteratorClose(iteratorRecordresult).
Вернуть result.

 

ArrayAssignmentPattern : [ Elision opt AssignmentRestElement ]

1. Пусть iteratorRecord будет ? GetIterator(value).
2. Если присутствует Elision, то
   а. Пусть status будет IteratorDestructuringAssignmentEvaluation из Elision с аргументом iteratorRecord.
   b. Если status является внезапным завершением, то
      i. Утверждено: iteratorRecord.[[Done]] истинно - является true.
      ii. Вернуть Completion(status).
3. Пусть результатом result будет IteratorDestructuringAssignmentEvaluation для AssignmentRestElement с аргументом iteratorRecord.
4. Если iteratorRecord.[[Done]] ложен - является false, вернуть ? IteratorClose(iteratorRecord, result).
5. Вернуть result.

 

ArrayAssignmentPattern : [ AssignmentElementList ]

1. Пусть iteratorRecord будет ? GetIterator(value).
2. Пусть результатом result будет IteratorDestructuringAssignmentEvaluation для AssignmentRestElement с аргументом iteratorRecord.
3. Если iteratorRecord.[[Done]] ложен - является false, вернуть ? IteratorClose(iteratorRecord, result).
4. Вернуть result.

 

ArrayAssignmentPattern : [ AssignmentElementList , Elision opt AssignmentRestElement opt ]

1. Пусть iteratorRecord будет ? GetIterator(value).
2. Пусть status будет IteratorDestructuringAssignmentEvaluation для AssignmentElementList с аргументом iteratorRecord.
3. Если status является внезапным завершением, то
   а. Если iteratorRecord.[[Done]] ложен - является false, вернуть ? IteratorClose(iteratorRecord, status).
   b. Вернуть Completion(status).
4. Если присутствует Elision, то
   а. Установите status на результат выполнения IteratorDestructuringAssignmentEvaluation из Elision с iteratorRecord в качестве аргумента.
   b. Если status является внезапным завершением, то
      i. Утверждено: iteratorRecord.[[Done]] является true (истинно).
      ii. Вернуть Completion(status).
5. Если присутствует AssignmentRestElement, то
   а. Установите status на результат выполнения IteratorDestructuringAssignmentEvaluation для AssignmentRestElement с iteratorRecord в качестве аргумента.
6. Если iteratorRecord.[[Done]] является false (ложным), вернуть ? IteratorClose(iteratorRecord, status).
7. Вернуть Completion(status).

 

ObjectAssignmentPattern : { AssignmentRestProperty }

1. Выполнить ? RequireObjectCoercible(value).
2. Пусть excludedNames будет новым пустым списком List.
3. Вернуть результат выполнения RestDestructuringAssignmentEvaluation из AssignmentRestProperty со значением value и excludedNames в качестве аргументов.

 

ObjectAssignmentPattern : { AssignmentPropertyList , AssignmentRestProperty }

 ? RequireObjectCoercible(value).
Пусть excludedNames будет ? PropertyDestructuringAssignmentEvaluation из AssignmentPropertyList с аргументом value.
 RestDestructuringAssignmentEvaluation из AssignmentRestProperty с аргументами value и excludedNames.

 

Семантика времени выполнения: оценка присвоения деструктуризации свойств — PropertyDestructuringAssignmentEvaluation

C параметром value

Примечание

Следующие операции собирают список всех имен деструктурированных свойств.

 

AssignmentPropertyList : AssignmentPropertyList , AssignmentProperty

1. Пусть propertyNames будет ? PropertyDestructuringAssignmentEvaluation для AssignmentPropertyList с аргументом value.
2. Пусть nextNames будет ? PropertyDestructuringAssignmentEvaluation для AssignmentProperty с аргументом value.
3. Добавьте каждый элемент в nextNames в конец propertyNames.
4. Вернуть propertyNames.

 

AssignmentProperty : IdentifierReference Initializer opt

1. Пусть P будет строковым значением StringValue для IdentifierReference.
2. Пусть lref будет ? ResolveBinding(P).
3. Пусть v будет ? GetV(value; P).
4. Если присутствует Initializer opt и v является undefined(не определено), то
   а. Если IsAnonymousFunctionDefinition(Initializer) является true (истинно), то
      i. Установите v равным результату выполнения NamedEvaluation для инициализатора Initializer с аргументом P.
   b. Иначе,
      i. Пусть defaultValue будет результатом оценки Initializer.
      ii. Установите v на ? GetValue(defaultValue).
5. Выполнить ? PutValue(lref, v).
6. Верните список List, единственным элементом которого является P.

 

AssignmentProperty : PropertyName : AssignmentElement

1. Пусть имя name будет результатом оценки PropertyName.
2. ReturnIfAbrupt(name).
3. Выполнить ? KeyedDestructuringAssignmentEvaluation для AssignmentElement со значением value и именем name в качестве аргументов.
4. Вернуть список List, единственным элементом которого является имя name.

 

Семантика времени выполнения: оценка назначения деструктуризации отдыха — RestDestructuringAssignmentEvaluation

С параметрами value и excludedNames.

AssignmentRestProperty :  DestructuringAssignmentTarget

1. Пусть lref будет результатом вычисления DestructuringAssignmentTarget.
2. ReturnIfAbrupt(lref).
3. Пусть restObj будет ! OrdinaryObjectCreate(%Object.prototype%).
4. Выполнить ? CopyDataProperties(restObj, value, excludedNames).
5. Верните PutValue(lref, restObj).

 

Семантика времени выполнения: оценка присваивания деструктуризации итератора — IteratorDestructuringAssignmentEvaluation

С параметром iteratorRecord.

AssignmentElementList : AssignmentElisionElement

1. Верните результат выполнения IteratorDestructuringAssignmentEvaluation для AssignmentElisionElement, используя iteratorRecord в качестве аргумента.

 

AssignmentElementList : AssignmentElementList , AssignmentElisionElement

1. Выполнить ? IteratorDestructuringAssignmentEvaluation для AssignmentElementList с использованием iteratorRecord в качестве аргумента.
2. Вернуть результат выполнения IteratorDestructuringAssignmentEvaluation для AssignmentElisionElement, используя iteratorRecord в качестве аргумента.

 

AssignmentElisionElement : AssignmentElement

1. Верните результат выполнения IteratorDestructuringAssignmentEvaluation для AssignmentElement с помощью iteratorRecord в качестве аргумента.

 

AssignmentElisionElement : Elision AssignmentElement

1. Выполнить? IteratorDestructuringAssignmentEvaluation из Elision с параметром iteratorRecord в качестве аргумента.
2. Вернуть результат выполнения IteratorDestructuringAssignmentEvaluation для AssignmentElement с параметром iteratorRecord в качестве аргумента.

 

Elision : ,

1. Если iteratorRecord.[[Done]] является false (ложен), то
   а. Пусть next будет IteratorStep(iteratorRecord).
   b. Если next является внезапным завершением, установите для iteratorRecord.[[Done]] значение true.
   c. ReturnIfAbrupt(next).
   d. Если значение next равно false, установите для iteratorRecord.[[Done]] значение true.
2. Верните NormalCompletion(empty).

 

Elision : Elision ,

1. Выполнить ? IteratorDestructuringAssignmentEvaluation из Elision с параметром iteratorRecord в качестве аргумента.
2. Если iteratorRecord.[[Done]] имеет значение false, то
   а. Пусть next будет IteratorStep(iteratorRecord).
   b. Если next является внезапным завершением, установите для iteratorRecord.[[Done]] значение true.
   c. ReturnIfAbrupt(next).
   d. Если next равно false, установите для iteratorRecord.[[Done]] значение true.
3. Верните NormalCompletion(empty).

 

AssignmentElement : DestructuringAssignmentTarget Initializer opt

1. Если DestructuringAssignmentTarget не является ни ObjectLiteral, ни ArrayLiteral, тогда
   а. Пусть lref будет результатом вычисления DestructuringAssignmentTarget.
   b. ReturnIfAbrupt(lref).
2. Если iteratorRecord.[[Done]] имеет значение false, то
   а. Пусть next будет IteratorStep(iteratorRecord).
   b. Если next является внезапным завершением, установите для iteratorRecord.[[Done]] значение true.
   c. ReturnIfAbrupt(next).
   d. Если значение next равно false, установите для iteratorRecord.[[Done]] значение true.
   е. Иначе,
      i. Пусть value будет IteratorValue(next).
      ii. Если значение value является внезапным завершением, установите для iteratorRecord.[[Done]] значение true.
      iii. ReturnIfAbrupt(value).
3. Если iteratorRecord.[[Done]] является true (истинно), пусть значение value будет undefined (не определено).
4. Если Initializer присутствует и значение value является undefined (не определено), то
   а. Если IsAnonymousFunctionDefinition(Initializer) является true (истинно), а IsIdentifierRef для DestructuringAssignmentTarget является true (истинно), то
      i. Пусть v будет ? NamedEvaluation инициализатора Initializer с аргументом lref.[[ReferencedName]].
   b. Иначе,
      i. Пусть defaultValue будет результатом оценки Initializer.
      ii. Пусть v будет ? GetValue(defaultValue).
5. Иначе, пусть v будет значением value.
6. Если DestructuringAssignmentTarget - это ObjectLiteral или ArrayLiteral, тогда
   а. Пусть nestedAssignmentPattern будет AssignmentPattern, который покрывается DestructuringAssignmentTarget.
   b. Вернуть результат выполнения DestructuringAssignmentEvaluation для nestedAssignmentPattern с v в качестве аргумента.
7. Вернуться ? PutValue(lref, v).

 

Примечание

Порядок оценки слева направо поддерживается путем оценки DestructuringAssignmentTarget, который не является шаблоном деструктуризации, до доступа к итератору или оценки инициализатора Initializer.

 

AssignmentRestElement :  DestructuringAssignmentTarget

1. Если DestructuringAssignmentTarget не является ни ObjectLiteral, ни ArrayLiteral, тогда
   а. Пусть lref будет результатом вычисления DestructuringAssignmentTarget.
   b. ReturnIfAbrupt(lref).
2. Пусть А будет ! ArrayCreate(0).
3. Пусть n равно 0.
4. Повторите, пока iteratorRecord.[[Done]] имеет значение false,
   а. Пусть next будет IteratorStep(iteratorRecord).
   b. Если next является внезапным завершением, установите для iteratorRecord.[[Done]] значение true.
   c. ReturnIfAbrupt(next).
   d. Если значение next равно false, установите для iteratorRecord.[[Done]] значение true.
   е. Иначе,
      i. Пусть nextValue будет IteratorValue(next).
      ii. Если nextValue является внезапным завершением, установите для iteratorRecord.[[Done]] значение true.
      iii. ReturnIfAbrupt(nextValue).
      iv. Выполнить ! CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), nextValue).
      v. Установите n равным n + 1.
5. Если DestructuringAssignmentTarget не является ни ObjectLiteral, ни ArrayLiteral, тогда
   а. Вернуть ? PutValue(lref, A).
6. Пусть nestedAssignmentPattern будет AssignmentPattern, который покрывается DestructuringAssignmentTarget.
7. Верните результат выполнения DestructuringAssignmentEvaluation для nestedAssignmentPattern с A в качестве аргумента.

 

Семантика времени выполнения: оценка назначения деструктуризации с ключом — KeyedDestructuringAssignmentEvaluation

С параметрами value и propertyName.

AssignmentElement : DestructuringAssignmentTarget Initializer opt

1. Если DestructuringAssignmentTarget не является ни ObjectLiteral, ни ArrayLiteral, тогда
   а. Пусть lref будет результатом вычисления DestructuringAssignmentTarget.
   b. ReturnIfAbrupt(lref).
2. Пусть v будет ? GetV(value; propertyName).
3. Если инициализатор Initializer присутствует и v является undefined (не определено), то
   а. Если IsAnonymousFunctionDefinition(Initializer) и IsIdentifierRef из DestructuringAssignmentTarget истинны (оба являются true), то
      i. Пусть rhsValue будет ? NamedEvaluation инициализатора Initializer с аргументом lref.[[ReferencedName]].
   b. Иначе,
      i. Пусть defaultValue будет результатом оценки Initializer.
      ii. Пусть rhsValue будет ? GetValue(defaultValue).
4. В противном случае пусть rhsValue будет v.
5. Если DestructuringAssignmentTarget является ObjectLiteral или ArrayLiteral, тогда
   а. Пусть assignmentPattern будет AssignmentPattern, который покрывается DestructuringAssignmentTarget.
   b. Вернуть результат выполнения DestructuringAssignmentEvaluation для assignmentPattern с rhsValue в качестве аргумента.
6. Вернуться? PutValue(lref, rhsValue).

 

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

Стандарт ECMAScript — Раздел «12.7 Punctuators» — https://tc39.es/ecma262/#sec-punctuators

Стандарт ECMAScript — Раздел «13.15 Assignment Operators» — https://tc39.es/ecma262/#sec-assignment-operators