Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 下一行的连续运算符是否存在分号插入危险?_Javascript_Newline_Ecmascript 5_Code Formatting - Fatal编程技术网

Javascript 下一行的连续运算符是否存在分号插入危险?

Javascript 下一行的连续运算符是否存在分号插入危险?,javascript,newline,ecmascript-5,code-formatting,Javascript,Newline,Ecmascript 5,Code Formatting,从历史上看,我喜欢打断表达,以便在续行上显示“显然不完整”的偏见: var something = foo + bar + baz(mumble); 这种态度来自于使用需要分号来终止表达式的语言。由于没有分号,第一行显然已经不完整,因此最好向读者说明第二行不完整 另一种选择是: var something = foo + bar + baz(mumble); 那对我没那么好。现在唯一能告诉你的是baz(咕哝)不是独立的(缩进除外)是将眼睛扫描到前一行的末尾。*(这可能很长,因

从历史上看,我喜欢打断表达,以便在续行上显示“显然不完整”的偏见:

var something = foo + bar
    + baz(mumble);
这种态度来自于使用需要分号来终止表达式的语言。由于没有分号,第一行显然已经不完整,因此最好向读者说明第二行不完整

另一种选择是:

var something = foo + bar +
    baz(mumble);
那对我没那么好。现在唯一能告诉你的是
baz(咕哝)不是独立的(缩进除外)是将眼睛扫描到前一行的末尾。*(这可能很长,因为您首先需要打破它。)*

但在bizarro JavaScript领域,我开始看到人们将代码从第一种形式更改为第二种形式,并警告“自动插入分号”。这当然会导致。在我将“了解自动分号插入是什么以及我是否也应该这样做”放入无限任务队列时,我并不想深入研究这个切线

当我调查的时候,我发现自己有点不确定。。。但不确定。。。我使用它的方式没有危险。如果我在《事故》中不写
+
,而是写下:

var something = foo + bar
    baz(mumble);
…然后JavaScript在
foo+bar
之后为您插入一个分号,似乎是因为这两行作为完整的表达式独立存在。我推断,也许其他JavaScript程序员认为将“明显故意不完整”位偏倚到要继续的行的末尾会更好,因为它精确地指出了分号不存在的位置

然而,如果我正确地陈述了我的前提,我正在以一种方式设计我的断线,即接下来的线“显然是不完整的”。如果不是这样的话,我就不会认为我的优势首先。

我说的对吗,我的方式对于我描述的如何使用线路延续的条件来说不是一种风险?是否存在任何“看似不完整”的表达陷阱,而这些陷阱实际上是以令人惊讶的方式完成的?

提供一个“完全令人惊讶的方式”的例子,考虑是否<代码> 1;<代码>本身可以解释为一行上的正代码。它似乎可以:

但JSFIDLE为此返回了6:

var x = 3 + 2
+ 1;
alert(x)
也许这只是控制台中的一个怪癖,但它让我担心我的“只要第二行不是独立的完整表达式就行”解释

我开始看到人们将代码从第一种形式更改为第二种形式,并警告“自动插入分号”

那是垃圾。当您有一个操作员(在任一行上)时,将没有ASI-请参阅

由于操作员的两种放置方式都会起作用,因此这两种方式都被普遍接受,并归结为个人/风格指南偏好。您已经命名了一些参数,一旦您选择了两者之一,请坚持使用它以保持一致性


这两者都没有什么“危险”,老实说,你不应该关心ASI。人们被它咬了一口,只是因为a)他们不喜欢分号,希望自动插入,但下一行是语法上有效的延续,或者b)他们在
return
语句后以Allman风格写入对象/数组文字。

如果你取一些语法上有效的行并用换行符标点它,自动分号插入将不适用(以下列出的
return
throw
和极少数其他语句除外)。ASI仅在绝对没有其他解释代码的方法时发生。当然,有一种方法可以将多行代码解释为一条语句,因为它作为一行是有效的。简而言之,ASI通常是解析器试图理解程序的最后手段

举ES5的例子,发生了

  • 当从左到右解析程序时,遇到语法的任何产物都不允许的标记(称为违规标记)
  • 但是这种情况很自然地被消除了,因为在注入新行之前,您有一个语法上有效的行。因此,ASI的这种情况不适用于您的情况,因为它依赖于没有分号在语法上无效的代码范围。这里没有

    (其他两种情况也不适用;第二种情况适用于程序的结尾,第三种情况适用于
    继续
    中断
    返回
    抛出
    ,以及后缀
    +
    /
    -
    运算符。)


    人们对ASI的常见问题是,当一个作者有两行,他希望这两行是分开的,但当这两行被理解为一行时,不会引起语法问题。这种情况从两行开始,它们意外地变成了一行。你的情况正好相反:你从一行开始;它不会意外地变成两个。

    如果您省略了连接
    +
    ,两种形式都会插入分号,因此您喜欢哪一种形式都是个人偏好(因此这里不是一个真正需要问的问题)。也许您应该从不同的角度来看待它。为什么您的代码中有这样的模式,您可以对此做些什么?所有可以连接的东西都可以减少,那么
    [foo,bar,baz(mumble)]怎么样。减少(sum)
    ,你可以随意缩进数组。@RobG如果答案是这样的话,我会接受“你是正确的,没有任何你忽略的东西是危险的”。(或者换句话说,如果我确信这是完全主观的,我就不会问了。)这似乎是一个完全合理的问题。@B不,那不是我的问题。一个人可以问一个问题,具体问题的含义是什么