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不,那不是我的问题。一个人可以问一个问题,具体问题的含义是什么