在某些Javascript代码中出现错误,其中小数0.04被声明为0.0.4,如下所示:
var x = 0.0.4;
当在Firefox中运行时,给出的错误是:
SyntaxError: missing ; before statement
IE声明:
Expected ';'
Chrome说:
Uncaught SyntaxError: Unexpected number
我理解0.0.4不是数字或文字,但是Javascript如何试图使用该语句?为什么它认为有一个缺失; ?
答案 0 :(得分:2)
Chrome将分配的第一部分视为浮点数0.0
,您要为其访问密钥0
的属性,这在JavaScript中是不允许的(您不能使用点表示法来参考数字键)。换句话说,您可以将分配拆分为以下等效项:
var x = 0.0
x.0 // Throws unexpected number
相比之下,这是有效的:
var x = 0.0.toString()
在我看来,这是解析器最符合逻辑的实现,其中包含最有意义的错误。
Firefox将分配的第一部分视为浮点数0.0
,但对.0
部分感到困惑 - 它不会将此识别为属性访问,而是认为您要启动一个新的语句(.4
,它是0.4
的简写) - 因此它告诉你错过了一个分号,用于终止语句。
当您使用有效的属性访问器(字符串)时,它仍然正确地解释了该语句:
var x = 0.0.toString()
有些相关的也是this SO question,它讨论了类似的行为。
答案 1 :(得分:1)
根据解析器(浏览器),它处理一行代码的方式可能不同。我的想法是,当IE和Firefox看到一个数字时,他们只会"期待"一个数字的单个小数,然后是数字字符,直到一个空格或一个&#39 ;;'发生。
如果遇到另一个字符类型,解析器会抛出一个异常,它正在查找数字的结尾 - 因此Expected ';'
。
在Chrome如何处理它的领域,似乎它可以告诉它应该是一个数字,但它是以无效格式提供的。
答案 2 :(得分:1)
来自IE和Firefox的消息非常有意义。将语句的数字部分解析为0.0
,执行赋值x = 0.0
,然后期望语句结束。如果后面的字符不是分号或换行符(语句的隐含结尾),则抛出一个错误,表示我们期望一个。
Chrome有点神秘,但仍然有点想法。它已经使用FF和IE(x = 0.0
)执行了赋值,但是将点解释为点运算符而不是小数。 (x = 0.0.toString()
将是完全有效的。)而不是陈述它所期望的内容,而不是陈述它所看到的,一个“意外数字”,即4
。
目前还不清楚IE和FF是否首先将.4
解析为数字,或者意外字符是否只是一个点。