【问题标题】:Why is 1 + '1' = '11' and 1 - '1' = 0 in JavaScript (Coercion)? [duplicate]为什么在 JavaScript(强制)中 1 + '1' = '11' 和 1 - '1' = 0? [复制]
【发布时间】:2014-11-11 15:14:00
【问题描述】:

这在逻辑上似乎很明显(字符串不能减去),但我想知道在 JavaScript 的底层执行中如何做出这个决定。这里究竟是如何应用强制规则的?

【问题讨论】:

  • 都在the language specification。请参见第 11.6.1 节(加法)和第 11.6.2 节(减法)。请注意,步骤完全不同。
  • 加号 + 运算符被重载:当你给它一个字符串 ('1') 和一个带有 + 符号的 int 时,它会将它们连接起来(因此你有 11)。不可能进行减法连接,因此 JavaScript 会进行实际的减法运算,将两个操作数都设为整数。

标签: javascript


【解决方案1】:

- is defined in terms of ToNumber,而+ 有一个额外的clause for strings(强调我的):

11.6.1 加法运算符 (+)

加法运算符要么执行字符串连接,要么执行数字 补充。

生产

AdditiveExpression : AdditiveExpression +  MultiplicativeExpression 

评估如下:

  1. lref 成为评估AdditiveExpression 的结果。
  2. lval 成为GetValue(lref)
  3. rref 成为评估MultiplicativeExpression 的结果。
  4. rval 成为GetValue(rref)
  5. lprim 成为ToPrimitive(lval)
  6. rprim 成为ToPrimitive(rval)
  7. 如果Type(lprim)StringType(rprim)String,那么
    • 返回字符串,它是连接ToString(lprim) 后跟ToString(rprim) 的结果

[...]

【讨论】:

猜你喜欢
  • 2023-01-26
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多