Синтаксис операторов присваивания
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):
- Это Синтаксическая Ошибка (Syntax Error), если LeftHandSideExpression не покрывает AssignmentPattern.
- Все правила Ранней Ошибки для AssignmentPattern и производных от него производств также применяются к AssignmentPattern, который покрывается LeftHandSideExpression.
Если LeftHandSideExpression не является ни ObjectLiteral, ни ArrayLiteral, применяется следующее правило ранней ошибки:
- Это синтаксическая ошибка, если AssignmentTargetType для LeftHandSideExpression не является простым —
simple
AssignmentExpression (Выражение присвоения) :
LeftHandSideExpression AssignmentOperator AssignmentExpression (Выражение присвоения)
LeftHandSideExpression &&= AssignmentExpression (Выражение присвоения)
LeftHandSideExpression ||= AssignmentExpression (Выражение присвоения)
LeftHandSideExpression ??= AssignmentExpression (Выражение присвоения)
- Это Синтаксическая Ошибка, если AssignmentTargetType для LeftHandSideExpression не является простым —
simple
Семантика времени выполнения: Оценка
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).
В вызовах ToPrimitive на шагах 2.a и 2.b подсказка не дается. Все стандартные объекты, кроме объектов Date, обрабатывают отсутствие подсказки, как если бы было задано число — number
; Объекты Date обрабатывают отсутствие подсказки, как если бы была дана строка — string
. Экзотические предметы могут справиться с отсутствием подсказки иным образом.
Шаг 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
- Это синтаксическая ошибка, если AssignmentTargetType для IdentifierReference не является простым —
simple
.
AssignmentRestProperty : … DestructuringAssignmentTarget
- Это синтаксическая ошибка, если DestructuringAssignmentTarget является ArrayLiteral или ObjectLiteral.
DestructuringAssignmentTarget : LeftHandSideExpression
Если LeftHandSideExpression является ObjectLiteral или ArrayLiteral, применяются следующие правила Ранней Ошибки:
- Это синтаксическая ошибка, если LeftHandSideExpression не покрывает AssignmentPattern.
- Все правила ранней ошибки для AssignmentPattern и производных от него производств также применяются к AssignmentPattern, который покрывается LeftHandSideExpression.
Если LeftHandSideExpression не является ни ObjectLiteral, ни ArrayLiteral, применяется следующее правило ранней ошибки:
- Это синтаксическая ошибка, если AssignmentTargetType для LeftHandSideExpression не является простым —
simple
.
Семантика времени выполнения: деструктуризация оценки присвоения — DestructuringAssignmentEvaluation
С параметром value
ObjectAssignmentPattern : { }
RequireObjectCoercible(value). Вернуть NormalCompletion(empty).?
{ AssignmentPropertyList , }
RequireObjectCoercible(value). Выполнить ? PropertyDestructuringAssignmentEvaluation для AssignmentPropertyList используя value в качестве аргумента. Вернуть NormalCompletion(empty).Выполнить ?
ArrayAssignmentPattern : [ ]
iteratorRecord будет ? GetIterator(value). Вернуть ? IteratorClose(iteratorRecord, NormalCompletion(empty)).Пусть
ArrayAssignmentPattern : [ Elision ]
iteratorRecord будет ? GetIterator(value). Пусть result будет IteratorDestructuringAssignmentEvaluation из Elision с аргументом iteratorRecord. Если iteratorRecord.[[Done]] является false, вернуть ? IteratorClose(iteratorRecord, result). Вернуть 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).
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