【问题标题】:Why does 00.0 cause a syntax error?为什么 00.0 会导致语法错误?
【发布时间】:2015-08-02 20:04:09
【问题描述】:

这很奇怪。这就是在 Chrome(版本 42.0.2311.135,64 位)中的 JavaScript 控制台发生的情况。

> 0
< 0
> 00
< 0
> 0.0
< 0
> 00.0
X Uncaught > SyntaxError: Unexpected number

Firefox 37.0.2 做同样的事情,虽然它的错误信息是:

SyntaxError: missing ; before statement

关于 JavaScript 解析数字的方式可能有一些技术解释,也许它只能在修改控制台提示符时发生,但它似乎仍然是错误的。

为什么要这样做?

【问题讨论】:

  • 在这里,我想我已经看过该语言的所有WTF了...而且我总是喜欢 ????片刻之后。
  • 这不是只在控制台出现的问题,var i = 00.0; 总是会抛出 SytaxError。
  • AFAIK 中的 JS 浮点字面量应该包含 decimal 整数。前导零表示 八进制 整数 (ref.)
  • 好点,@pstenstrm。我想问题是在解析源代码(包括在控制台输入的内容)时,Javascript 对什么是有效的和无效的有严格的规定;而在处理字符串(这是 user 输入到达的形式)时,它会更加努力地获得结果。所以Number("00.0") 有效,而Number(00.0) 无效。
  • @ChrisDennis 正确,问题在于根据语法解析源代码。 Number() 函数使用的规则与解析器使用的规则不同(参见ToNumber Applied to the String Type)。

标签: javascript numbers syntax-error


【解决方案1】:

表达式0.000.0 的解析方式不同。

  • 0.0 被解析为数字文字 1
  • 00.0 被解析为:
    • 00 – 八进制数字文字 2
    • . – 属性访问器
    • 0 – 标识符名称

您的代码抛出语法错误,因为 0 不是有效的 JavaScript 标识符。以下示例有效,因为 toString 是有效标识符:

00.toString

1Section 7.8.3 – 前导 0 可以后跟 小数分隔符ExponentPart
2Section B.1.1 – 前导 0 后面可以跟 OctalDigits

【讨论】:

  • 请注意,00.0 到 07.0 会引发异常,但 08.0 和 09.0 完全有效,因为引擎无法将它们识别为八进制数,而是将它们解析为十进制数。
  • @ChadSchouggins 奇怪的是,数字 '8' 和 '9' 足以告诉解析器它是十进制数而不是八进制数,而 decimal 点不是。这就是重载 '.' 的结果。我想。我会以不同的方式实现解析器...(我是否足够聪明来实现解析器)。
【解决方案2】:

00 被评估为八进制数,.0 被评估为访问该数字的属性。但是由于不允许将整数用作属性访问器,所以会抛出错误。

对于任何其他对象,您都会收到相同的错误:

'string'.0 // Syntax error: unexpected number
({}).0 // Syntax error: unexpected number

您可以在MDN 上找到有关属性访问器的相关信息。

【讨论】:

  • 在最新规范中,八进制文字以0o 开头。但是,由于向后兼容,旧语法不太可能从浏览器实现中删除。
  • 好一个。如果您发现一些关于此的文档,请随时编辑答案以包含该信息和链接 - 它可能对未来的读者有用!
  • 您可能应该删除不正确的部分,或者可能更好的是,修改/重写它以使其正确......并重写而不是添加(即顶部没有单独的“编辑”块/底部,而是重写答案以无缝集成新添加的信息)在长期价值方面通常更好。
  • 已更新。感谢您的反馈!
  • @SalmanA 出乎意料的是点后的0,而不是00中的最后一个0
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 2011-04-21
  • 2010-12-09
  • 2015-05-15
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多