最近我看到一些奇怪的代码,看起来有点像这样:
let a;
if ((a = anotherVariable)) {
....
}
你能向我解释一下这是什么意思吗?为什么要这样做?
编辑:
请注意,他不是在比较a
和anotherVariable
,而是在赋值。if括号中没有其他项,所以它不像if ((something) && (something else)) {...}
。
那么,为什么不单独分配a
变量,然后检查anotherVariable
的真实性呢?
此处为原始代码(搜索matched = prevTextFromSpace
(。
如果您编写
if (a = anotherVariable) {
....
}
它运行良好,但=
是一个赋值,而不是比较。
表达式a = b
的值是b
的值(并且它也存储在变量a
中(。如果b
的计算结果为真值,则采用if
分支。
然而,由于=
不是==
,linter程序通常将如上所述的if
语句标记为潜在错误。很多时候,开发人员想要==
,却错误地键入了=
。门楣工试图检测这个错误。
如果真正的意图是在a
中复制b
的值,并将该值用作if
语句的条件(而不是将a
与b
进行比较(,则上述代码是正确的。有两种方法可以使门楣警告静音:
将赋值放在
if
语句前面:a = b if (a) { ... }
将作业放在一对括号内:
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))
希望这能有所帮助!