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


71

真奇怪 这是在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解析数字的方式可能有一些技术上的解释,也许只有在修改控制台提示时才会发生,但是似乎还是错误的。

为什么这样做呢?


13
在这里,我以为我已经看过该语言的所有WTF ...而且以后我总是很喜欢。
罗伯特·罗斯曼

2
这不是仅在控制台中发生的问题,var i = 00.0;它将始终引发SytaxError。
pstenstrm 2015年

3
JS浮点文字中的AFAIK应包含十进制整数。前导零表示八进制整数(参考
最迟

1
好点,@ pstenstrm。我想问题在于,在解析源代码(包括在控制台上键入的内容)时,JavaScript对什么是有效和无效是有严格的规定。而当处理字符串(用户输入所到达的形式)时,它会更努力地获取结果。因此Number("00.0")工作而Number(00.0)没有。
克里斯·丹尼斯

@ChrisDennis正确,问题在于根据语法解析源代码。Number()函数使用的规则与解析器使用的规则不同(请参阅应用于String类型的ToNumber)。
Salman A

Answers:


76

表达式0.000.0被不同地解析。

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

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

00.toString

1 第7.8.3节–前导0后面可以是小数点分隔符指数部分
2 B.1.1节–前导0后面可以是OctalDigits


18
请注意,00.0到07.0会引发一个异常,但是08.0和09.0是完全有效的,因为引擎不会将它们识别为八进制,因此将它们解析为十进制数字。
乍得·舍金斯

@ChadSchouggins很好奇,数字'8'和'9'足以告诉解析器它是一个十进制而不是八进制数字,而十进制点不是。这就是重载'。'的结果。我想。我将以不同的方式实现解析器...(我足够聪明地可以完全实现解析器)。
克里斯·丹尼斯

22

00被评估为八进制数字,.0并被评估为访问该数字的属性。但是由于不允许将整数用作属性访问器,因此会引发错误。

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

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

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


7
在最新规范中,八进制文字以开头0o。但是,由于向后兼容,旧语法不太可能从浏览器实现中删除。
狮子座

好一个 如果您发现有关此问题的一些文档,可以随时编辑答案以包含该信息和链接-这可能对将来的读者有用!
罗伯特·罗斯曼

您可能应该删除不正确的部分,或者最好将其修改/重写为正确的……并重写而不是添加(即,在顶部/底部没有单独的“ Edit”块,而是重写答案)。无缝集成新添加的信息)在长期价值方面通常更好。
2015年

更新。感谢您的反馈!
罗伯特·罗斯曼

@SalmanA它是0是意外,不是最后一个点后000
mflodin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.