Strange TypeError in Node.js

Strange TypeError in Node.js

本文关键字:js Node in TypeError Strange      更新时间:2023-09-26

我正在阅读一本JavaScript书籍,并一直在使用Node.js执行代码示例。我一直在编写文件,然后运行node file.js

通常,我在编写JavaScript时使用分号,但我遵循这本书的风格。

我在执行其中一个代码示例时遇到了一个错误,我不明白为什么会发生这种情况。

执行:

var x = 2
var y = 3
(x == 2) && (y == 3)
(x > 3) || (y < 3)

导致错误的结果:

TypeError: 3 is not a function

如果在第2行之后添加;,例如

var x = 2
var y = 3;
(x == 2) && (y == 3)
(x > 3) || (y < 3)

它导致错误:

TypeError: (y == 3) is not a function

然而,如果我也在第三行之后放置;,例如

var x = 2
var y = 3;
(x == 2) && (y == 3);
(x > 3) || (y < 3)

事情进展顺利。

或者,如果我在Node.js命令行中(单独)运行每一行,一切都会很好。

这可能只是我对Node.js或JavaScript的误解。但我在网上找不到其他类似的情况。

我使用的是OS X 10.11.1和Node.js v.2.0(通过Homebrew安装)。

这可能发生在任何JavaScript环境中,而不仅仅是节点。关于何时可以省略分号,有一些特定的规则。这就是为什么社区中的大多数人都反对省略分号。

这是作为一个单独的语句执行的:

var y = 3
(x == 2) && (y == 3)
(x > 3) || (y < 3)

语句是由上下文(或分号)来描述的,而不是由空格或换行符来描述的。

var y = parseInt('10px');

与相同

var y = parseInt
('10px');

与相同

var y = parseInt             ('10px');

因此,当您尝试执行var y=3(x==2)时,JIT将3解释为一个函数,因为它后面有括号。

如果下一行以"("开头,则该语句不会被新行终止。因此,您需要一个";"或其他标记来指定该语句已结束。

您可以在这里和这里阅读更多关于javascript和分号的信息。


您的第一个错误发生是因为代码被中断为:

var y = 3(x == 2)

如果代码被中断,则第二个错误为:

(y == 3)(x > 3)

这些都是无效的。


添加分号会将代码更改为

var y = 3;(x == 2)

(y == 3);(x > 3)

这些都是有效的。


Javascript使用分号而不是换行符来表示一条语句的结束和另一条语句可能的开始。所以,当你试图执行:

var x = 2
var y = 3
(x == 2) && (y == 3)
(x > 3) || (y < 3)

它将其解释为:

var x = 2 var y = 3(x==2) && (y==3)(x > 3) || (y<3)

这似乎是您试图用函数3(x=2)的值初始化y,这对于javascript中的函数声明来说是错误的语法和语义。

当你在第二行后面放一个分号时,它会按照你的意思解释第1行和第2行,但第3行和第4行也出现了类似的问题,一旦你添加了分号,问题就解决了。

您只需要分号,javascript无法区分一个语句的结束和另一个语句开始。你可以省略它们,但一般规则是这样的。

如您所见,

a = b + c

(d + e).print()

不是通过自动分号插入来转换的,因为第二行开始的带括号的表达式可以被解释为函数调用的参数列表:

a = b +c(d + e).print()

在赋值语句必须以左括号开头的情况下,程序员最好在前一条语句的末尾提供一个显式分号,而不是依赖于自动插入分号。

在JavaScript中不使用分号进行编码时,这是一个众所周知的陷阱,对于Node.js也是如此。