赋值运算符
语法
AssignmentExpression : ConditionalExpression LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression
AssignmentExpressionNoIn : ConditionalExpressionNoIn LeftHandSideExpression = AssignmentExpressionNoIn LeftHandSideExpression AssignmentOperator AssignmentExpressionNoIn
AssignmentOperator : one of *= /= %= += -= <<= >>= >>>= &= ^= |=
语义
AssignmentExpressionNoIn 执行完全按照AssignmentExpression相同的方式,除了ConditionalExpressionNoIn替代了ConditionalExpression。
简单赋值
产生式 AssignmentExpression : LeftHandSideExpression = AssignmentExpression 按照下面的过程执行 :
- 令 lref 为解释执行 LeftH 和 SideExpression 的结果 .
- 令 rref 为解释执行 AssignmentExpression 的结果 .
- 令 rval 为 GetValue(rref).
- 抛出一个 SyntaxError 异常,当以下条件都成立 :Type(lref) 为 ReferenceIsStrictReference(lref) 为 trueType(GetBase(lref)) 为环境记录项GetReferencedName(lref) 为 "eval" 或 "arguments"
- 调用 PutValue(lref, rval).
- 返回 rval.
当赋值发生在严格模式中时其LeftHandSide执行结果不能是无法解引用的引用类型。假如这样它会在赋值时抛出ReferenceError异常。 LeftHandSide也不能是到具有{[[Writable]]:false}特性的数据属性的引用,到具有{[[Set]]:undefined}特性的访问器属性的引用,或者 [[Extensible]]内部属性值为false的对象上不存在的属性。这些情况都会抛出TypeError异常。
组合赋值
产生式 AssignmentExpression : LeftHandSideExpression'@ = AssignmentExpression, where @ represents one of the operators indicated above, 按照下面的过程执行 :
- 令 lref 为解释执行 LeftH 和 SideExpression 的结果 .
- 令 lval 为 GetValue(lref).
- 令 rref 为解释执行 AssignmentExpression 的结果 .
- 令 rval 为 GetValue(rref).
- 令 r 为作用运算符 @ 于 lval 和 rval 的结果。
- 抛出一个 SyntaxError 异常,当以下条件全部成立:Type(lref) 为 ReferenceIsStrictReference(lref) 为 trueType(GetBase(lref)) 为环境记录项GetReferencedName(lref) 为 "eval" 或 "arguments"
- 调用 PutValue(lref, r).
- 返回 r.
见 注11.13.1。
更多建议: