Javascript如何解释这个非法声明?

时间:2015-06-05 11:06:34

标签: javascript

在某些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如何试图使用该语句?为什么它认为有一个缺失; ?

3 个答案:

答案 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解析为数字,或者意外字符是否只是一个点。