【问题标题】:Are there semicolon insertion dangers with continuing operators on next line?下一行的连续运算符是否存在分号插入危险?
【发布时间】:2014-09-11 13:11:20
【问题描述】:

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

var something = foo + bar
    + baz(mumble);

这种态度源于使用需要分号来终止表达式的语言。由于没有分号,第一行已经明显不完整,所以最好让读者清楚第二行不完整。

替代方案是:

var something = foo + bar +
    baz(mumble);

这对我来说不是很好。现在,判断baz(mumble); 不是独立的(除了缩进)的唯一方法是将您的眼睛扫描到上一行的末尾。 *(这可能很长,因为你需要首先打破它。)*

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

当我仔细研究它时,我发现自己半信半疑……但不确定……我使用它的方式没有危险。如果我不小心把+ 写下来,问题似乎就会出现:

var something = foo + bar
    baz(mumble);

...然后 JavaScript 会在 foo + bar 之后为您插入一个分号,这似乎是因为这两行都是独立的完整表达式。我推断也许那些其他 JavaScript 程序员认为将“明显故意不完整”位偏向待续行的末尾会更好,因为它指出了 没有分号的位置

然而,如果我正确地陈述了我的前提,我正在以一种随后的线条“显然不完整”的方式来设计我的虚线。如果不是这样,那么我一开始就不会认为我的方式是一种优势。

我是对的吗,我的方式对于我描述的如何使用续行的条件没有风险?是否存在任何“看似不完整”的表达陷阱,实际上却以令人惊讶的方式完整?

为了提供“以令人惊讶的方式完成”的示例,请考虑+ 1; 是否可以单独解释为一行中的正数。它似乎可以:

但是 JSFiddle 为此返回 6:

var x = 3 + 2
+ 1;
alert(x)

也许这只是控制台中的一个怪癖,但它让我担心我的“只要第二行不单独作为完整表达式就可以了”解释。

【问题讨论】:

  • 如果您省略连接 +,这两种形式都会插入一个分号,因此您更喜欢哪一种是个人喜好(因此在这里不是真正要问的问题)。
  • 也许你应该从不同的角度来看待它。为什么你的代码中有这样的模式,你能做些什么呢?所有可以连接的东西都可以减少,那么[foo, bar, baz(mumble)].reduce(sum)怎么样,你可以随意缩进数组。
  • @RobG 我会接受“你是正确的,你没有忽略任何危险的东西”作为答案,如果这是答案的话。 (或者换一种说法,如果我确定这完全是主观的,我就不会问了。)
  • 似乎是一个完全合理的问题。
  • @bmargulies 不,这不是我的问题。一个人可以问一个规范的含义被怀疑的问题。如果不是,那么很多 C 和 C++ 问题与 Where do I find the current C or C++ standard documents 重复

标签: javascript newline ecmascript-5 code-formatting


【解决方案1】:

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

引用 ES5,first case of ASI detailed in the spec 出现...

  1. 当从左到右解析程序时,遇到任何语法生成都不允许的标记(称为违规标记)...

但这种情况自然会被消除,因为在向其中注入换行符之前,您有一个语法有效的行。因此,这种 ASI 案例不能适用于您的案例,因为它取决于没有分号的语法上无效的代码范围。你这里没有。

(其他两种情况也不适用;第二种情况适用于程序结束,第三种情况适用于continuebreakreturnthrow和后缀@987654328 @/-- 运营商。)

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

【讨论】:

  • 非常有用的框架,谢谢。似乎有很多关于这个问题的错误信息和误解。
【解决方案2】:

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

那是垃圾。当您有操作员(在任一线路上)时,将没有 ASI - 请参阅 What are the rules for JavaScript's automatic semicolon insertion (ASI)?

由于两种放置操作符的方式都可以,因此两者都被普遍接受,归结为个人/风格指南偏好。你已经命名了一些论点,一旦你选择坚持它以保持一致性。

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

【讨论】:

    猜你喜欢
    • 2013-12-22
    • 2018-07-27
    • 2023-04-07
    • 2011-10-24
    • 2012-09-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多