【问题标题】:How JavaScript's (0 == "") === true agrees with ECMA-262 type conversion rules?JavaScript 的 (0 == "") === true 如何与 ECMA-262 类型转换规则一致?
【发布时间】:2014-11-24 16:36:47
【问题描述】:

我已经看到几个问题解释了为什么 0 == ""JavaScript 中是 true,但我还有一个更深层次的问题。

因此,为什么0 == "" 在 JavaScript 中是 true 的答案是字符串 "" 被转换为数字,零长度字符串被转换为零数字,但这与 [9.3.1 paragraph of ECMA-262](http://www.ecma-international.org/ecma-262/5.1/#sec-9.3.1) 的说法是一致的字符串应该使用给定的正式语法进行解析,如果失败,则将此类字符串转换为NaN。当我查看这个规范时,我认为"" 不是字符串数字文字,它应该被解析为NaNNaN 不等于0.0

那么为什么上面的推测是不正确的,0 == "" 实际上是true

提前致谢。

【问题讨论】:

  • StringNumericLiteral ::: [empty]的MV为0。
  • 哦,谢谢。我需要更加专心。 :)

标签: javascript ecmascript-5 ecma262


【解决方案1】:

语法允许 StringNumericLiteral 为空:

StringNumericLiteral :::
StrWhiteSpaceopt
StrWhiteSpaceoptStrNumericLiteral StrWhiteSpaceopt

往下几行,上面写着:

为空或仅包含空格的 StringNumericLiteral 将转换为 +0

和:

StringNumericLiteral ::: [empty] 的 MV 为 0。

所以恐怕您根本没有完全阅读您正在查看的标准段落。 :)

【讨论】:

  • 以及“应注意 StringNumericLiteral 和 NumericLiteral 的语法之间的一些差异(请参阅 7.8.3): ... 为空或仅包含空格的 StringNumericLiteral 将转换为 + 0。”
  • 我想知道他们为什么要在主要的 StringNumericLiteral 条目中使用两个产生式。他们本可以在 StrNumericLiteral 之后添加 opt
  • @LightnessRacesinOrbit:除非我误解了你,否则 StrWhiteSpace(opt) StrNumericLiteral StrWhiteSpace(opt) 允许连续的空白。
  • 是的,因为 StrWhiteSpace 可以是多个空白字符。
  • @Barmar:哦,是的,它可以!然后,是的,我也不明白为什么。也许他们认为这可以让各个“用例”更加清晰。
猜你喜欢
  • 2013-12-30
  • 2014-02-04
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多