括号是否可以防止分号插入?

问题描述 投票:1回答:2

假设我想设置一组等于null的变量(并且不想使用数组/循环结构)或者我只想在多行中编写一个大的布尔表达式。在这种情况下,未公开的括号是否会阻止分号插入?例如。

some_variable = another_variable = yet_another_variable = (
    oh_look_a_parenthesis_above_me = hey_heres_another_variable) = (
    and_for_some_reason_another = last_one) = null;

要么

if(test_for_some_complex_expr && another_test || (
    but_maybe_this_one && or_this_one)) {
    // ...
}

这与使用&&||=在换行符上分组表达方式相比如何?即,这总是有效吗?

some_variable = another_variable = 
    a_variable_after_a_line_break = and_one_more;

while(test_for_an_expr && another_test || 
    (an_expr_here && and_an_expr_here)) {
    // ...
}

我正在寻找所有浏览器(包括IE6 +)最标准的方式。

javascript line-breaks automatic-semicolon-insertion
2个回答
2
投票

如果你的代码是没有分号的语法错误,则只会发生分号插入。在您的情况下,表达式是完全有效的,因此您不必担心分号插入 - 括号或不括号。

以分号插入的示例:

var a = 1
var b = 2

在上面的例子中,在换行符处插入分号,但这只是因为写入语法错误:

var a = 1 var b = 2

但写完是完全有效的:

var a = 1; var b = 2

规则变得棘手,因为JavaScript语法中存在一些不允许换行的实例。例如,'return'关键字和要返回的值之间不允许换行。所以这是一个语法错误:

return
  17;

但分号插入“修复”此错误的方式是插入一个像这样的分号:

return;
  17;

这可能不是作家的意图!在该特定情况下,可以使用括号来防止分号插入:

return (
   17);

因为它只在return关键字和表达式的开头之间不允许换行。在表达式中,这不是问题。


1
投票

在这种情况下,未公开的括号是否会阻止分号插入?

是。虽然没必要:

这与使用&&||=在换行符上分组表达方式相比如何?

它完全一样。它们是需要第二部分的表达式,因此ASI不能 - 不得 - 在不使结果无效的情况下启动。

只有在没有分号的情况下连续行无效时才会发生ASI。有关详细信息,请参阅What are the rules for JavaScript's automatic semicolon insertion (ASI)?

© www.soinside.com 2019 - 2024. All rights reserved.