if语句中有两组括号,这是什么意思?

时间:2018-12-11 11:55:00

标签: javascript

最近,我看到了一些看起来像这样的奇怪代码:

let a;
if ((a = anotherVariable)) {
 ....
}

您能告诉我这是什么意思,为什么要这么做吗?

编辑:

请注意,他没有将aanotherVariable进行比较,而是分配了它。而且if括号中没有其他术语,因此不像if ((something) && (something else)) {...}

那么为什么不只是分别分配a变量,然后检查anotherVariable的真实性呢?

原始代码here(搜索matched = prevTextFromSpace)。

3 个答案:

答案 0 :(得分:3)

如果你写

if (a = anotherVariable) {
 ....
}

它工作正常,但是=是分配,而不是比较。

表达式a = b的值就是b的值(它也存储在变量a中)。如果b评估为实值,则将使用if分支。

但是,由于=不是==,因此linter程序通常如上所述将if语句标记为潜在错误。开发人员想要==并错误地键入=的情况经常发生。短毛猫试图检测出此错误。

如果真正的目的是复制b中的a的值,并且还将此值用作if语句的条件(而不是比较ab),则上面的代码是正确的。有两种方法可以使短绒警告静音:

  1. 将分配放在if语句前面:

    a = b
    if (a) {
       ...
    }
    
  2. 将作业放在一对括号内:

    if ((a = b)) {
       ...
    }
    

    这使分配与if分离。分配不再是if条件。 分配只是较大表达式(a = b)的子表达式。

    此较大的表达式是if语句的条件,它不是赋值,因此没有任何警告。是的,它包含一个分配,但分配只是一个子表达式。

它看起来很像黑客,但事实并非如此。它仅表示对编程语言中的表达式和语句有很好的理解。

答案 1 :(得分:2)

内部括号仅计算其中包含的表达式。它将 otherVariable 的值分配给变量 a ,并将新值与条件中的其他操作数进行比较。

let a = 2, anotherVariable=20;
if ((a = anotherVariable) == 20) {
 console.log(a)
}

答案 2 :(得分:0)

除了对组件进行分组之外,它实际上不执行任何操作。假设它看起来像这样:

if (a && (b || c))

在这里,括号很重要,因为没有它们,JavaScript会错误地将它们解释为IIRC,如下所示:

if (a && b || c)

而且很难说输出了什么。当您使用多个三元运算符时,分组也很重要,如下所示:

if ((a : b ? c) && (d : g ? f))

在这里,括号非常重要-我知道一个极端的例子,但这很好地说明了我的观点。

简而言之,括号分组是进入JavaScript的一种好习惯,即使您有以下非常简单的条件,例如:

if ((a > b) && (c < d))

当您打算使用两层或多层以上的括号时,很容易感到困惑。想象一下,没有括号地思考这个问题!

if ((((a ? b : c) == (d < e)) && (f !== g)) || !(h == j))

希望这会有所帮助!