赋值运算符

2018-06-16 15:20 更新

语法

AssignmentExpression : ConditionalExpression LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpressionAssignmentExpressionNoIn : ConditionalExpressionNoIn LeftHandSideExpression = AssignmentExpressionNoIn LeftHandSideExpression AssignmentOperator AssignmentExpressionNoIn AssignmentOperator : one of *= /= %= += -= <<= >>= >>>= &= ^= |=

 语义

 AssignmentExpressionNoIn 执行完全按照AssignmentExpression相同的方式,除了ConditionalExpressionNoIn替代了ConditionalExpression。

简单赋值

 产生式 AssignmentExpression : LeftHandSideExpression = AssignmentExpression 按照下面的过程执行 :

  1. 令 lref 为解释执行 LeftH 和 SideExpression 的结果 .
  2. 令 rref 为解释执行 AssignmentExpression 的结果 .
  3. 令 rval 为 GetValue(rref).
  4. 抛出一个 SyntaxError 异常,当以下条件都成立 :Type(lref) 为 ReferenceIsStrictReference(lref) 为 trueType(GetBase(lref)) 为环境记录项GetReferencedName(lref) 为 "eval" 或 "arguments"
  5. 调用 PutValue(lref, rval).
  6. 返回 rval.

 当赋值发生在严格模式中时其LeftHandSide执行结果不能是无法解引用的引用类型。假如这样它会在赋值时抛出ReferenceError异常。 LeftHandSide也不能是到具有{[[Writable]]:false}特性的数据属性的引用,到具有{[[Set]]:undefined}特性的访问器属性的引用,或者 [[Extensible]]内部属性值为false的对象上不存在的属性。这些情况都会抛出TypeError异常。

组合赋值

 产生式 AssignmentExpression : LeftHandSideExpression'@ = AssignmentExpression, where @ represents one of the operators indicated above, 按照下面的过程执行 :

  1. 令 lref 为解释执行 LeftH 和 SideExpression 的结果 .
  2. 令 lval 为 GetValue(lref).
  3. 令 rref 为解释执行 AssignmentExpression 的结果 .
  4. 令 rval 为 GetValue(rref).
  5. 令 r 为作用运算符 @ 于 lval 和 rval 的结果。
  6. 抛出一个 SyntaxError 异常,当以下条件全部成立:Type(lref) 为 ReferenceIsStrictReference(lref) 为 trueType(GetBase(lref)) 为环境记录项GetReferencedName(lref) 为 "eval" 或 "arguments"
  7. 调用 PutValue(lref, r).
  8. 返回 r.

 见 注11.13.1。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号