“!”是什么意思7.2.14 ecmascript规范的抽象相等性比较

时间:2019-04-24 01:36:08

标签: javascript ecmascript-6

在下面的“抽象平等比较”部分中,我有点困惑:

比较x == y(其中x和y是值)产生true或false。这样的比较如下:

  1. 如果Type(x)与Type(y)相同,则 返回执行严格相等比较x === y的结果。
  2. 如果x为null且y未定义,则返回true。
  3. 如果x未定义且y为空,则返回true。
  4. 如果Type(x)为Number,Type(y)为String,则返回比较结果x == ! ToNumber(y)
  5. 如果Type(x)为String,Type(y)为Number,则返回比较结果! ToNumber(x) == y。
  6. 如果Type(x)为布尔型,则返回比较结果! ToNumber(x) == y。
  7. 如果Type(y)为Boolean,则返回比较结果x == ! ToNumber(y)
  8. ...

'!是什么意思?为! ToNumber(x)! ToNumber(y)

有人可以帮助我吗?谢谢!

1 个答案:

答案 0 :(得分:3)

含义在5.2.3.4 ReturnIfAbrupt Shorthands

部分中定义
  

类似地,前缀!用于表示对抽象或语法定向操作的后续调用将永远不会返回abrupt completion,并且所得到的Completion Record's [[Value]]字段应代替操作的返回值。例如,步骤:

1. Let val be ! OperationName(). 
     

等效于以下步骤:

1. Let val be OperationName().
2. Assert: val is never an abrupt completion.
3. If val is a Completion Record, set val to val.[[Value]]. 

使用突然的完成记录来传播错误,因此从根本上讲,这意味着这些过程不会引发错误,并且应该“取消包装”完成记录以使用其封装的实际值。