为什么输入00.0会导致语法错误?

71

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

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

Firefox 37.0.2同样会出现这个问题,尽管它的错误信息是:

SyntaxError: missing ; before statement

关于JavaScript如何解析数字可能有一些技术性的解释,也许只有在控制台提示符上进行调试时才会发生这种情况,但它仍然似乎是错误的。

为什么会这样呢?


14
我原以为我已经见识了语言中所有的“WTF”时,总会享受之后的那些时刻。 - Robert Rossmann
2
这不仅仅是在控制台中出现的问题,“var i = 00.0;”总是会引发SyntaxError。 - pstenstrm
3
据我所知,在JS中,浮点数字面量应包含十进制整数。前导零表示八进制整数(参考资料)。 - hindmost
1
好观点,@pstenstrm。我想问题在于当解析源代码(包括在控制台键入的内容)时,Javascript有其严格的规则来确定什么是有效的和无效的;而当处理字符串(这是用户输入的形式)时,它会更加努力地获取结果。因此,Number("00.0")可以工作,而Number(00.0)则不行。 - Chris Dennis
@ChrisDennis 正确,问题在于根据语法解析源代码。Number() 函数使用的规则与解析器使用的规则不同(请参见将 ToNumber 应用于 String 类型)。 - Salman A
2个回答

76

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

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

你的代码会抛出语法错误,因为0不是一个有效的 JavaScript 标识符。以下示例可以正常工作,因为toString是一个有效的标识符:

00.toString

1 第7.8.3节 - 前导零可以后跟小数点指数部分
2 第B.1.1节 - 前导零可以后跟八进制数字


18
请注意,00.0至07.0会引发异常,但是由于引擎无法将这些识别为八进制,因此08.0和09.0是完全有效的,会被解析为十进制数。请注意不改变原意。 - Chad Schouggins
@ChadSchouggins 奇怪的是,数字“8”和“9”足以告诉解析器它是十进制而不是八进制数,而小数点却不能。这就是过载“.”的结果吧。如果我足够聪明去实现一个解析器,我会以不同的方式实现解析器... - Chris Dennis

22

00会被解析为八进制数字,.0会被解析为访问该数字的属性。但是由于整数不能用作属性访问器,因此会抛出错误。

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

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

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


7
最新规范中的八进制字面量以0o开头。但是,由于向后兼容性,旧语法不太可能从浏览器实现中删除。 - Leo
不错。如果你找到了相关文档,随时可以编辑答案并包含信息和链接——这对未来的读者可能很有用! - Robert Rossmann
你应该删除错误的部分,或者更好的方法是修改/重写它以使其正确...而重写与添加相反(即不在顶部/底部有单独的“编辑”块,而是将答案重写为无缝集成新添加的信息)通常在长期价值方面更好。 - Bernhard Barker
更新了。感谢反馈! - Robert Rossmann
@SalmanA,意外的是小数点后面的0,而不是00中的最后一个0 - mflodin
@mflodin 这条评论是关于之前版本的回答。我会将其删除。 - Salman A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接