if语句中有两组括号,这意味着什么



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

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

你能向我解释一下这是什么意思吗?为什么要这样做?

编辑:

请注意,他不是在比较aanotherVariable,而是在赋值。if括号中没有其他项,所以它不像if ((something) && (something else)) {...}

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

此处为原始代码(搜索matched = prevTextFromSpace(。

如果您编写

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

它运行良好,但=是一个赋值,而不是比较。

表达式a = b的值是b的值(并且它也存储在变量a中(。如果b的计算结果为真值,则采用if分支。

然而,由于=不是==,linter程序通常将如上所述的if语句标记为潜在错误。很多时候,开发人员想要==,却错误地键入了=。门楣工试图检测这个错误。

如果真正的意图是在a中复制b的值,并将该值用作if语句的条件(而不是将ab进行比较(,则上述代码是正确的。有两种方法可以使门楣警告静音:

  1. 将赋值放在if语句前面:

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

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

    这将使分配与if解耦。分配不再是if条件。该赋值只是较大表达式(a = b)的一个子表达式。

    这个较大的表达式是if语句的条件,它不是赋值,因此没有什么可警告的。是的,它包含一个赋值,但该赋值只是一个子表达式。

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

内括号只是计算它所包含的表达式。它将把另一个变量的值分配给变量a,并将新值与条件中的其他操作数进行比较。

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

除了对组件进行分组之外,它实际上什么都不做。假设它看起来像这样:

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))

希望这能有所帮助!

最新更新