最近,我看到了一些看起来像这样的奇怪代码:
let a;
if ((a = anotherVariable)) {
....
}
您能告诉我这是什么意思,为什么要这么做吗?
编辑:
请注意,他没有将a
与anotherVariable
进行比较,而是分配了它。而且if括号中没有其他术语,因此不像if ((something) && (something else)) {...}
。
那么为什么不只是分别分配a
变量,然后检查anotherVariable
的真实性呢?
原始代码here(搜索matched = prevTextFromSpace
)。
答案 0 :(得分:3)
如果你写
if (a = anotherVariable) {
....
}
它工作正常,但是=
是分配,而不是比较。
表达式a = b
的值就是b
的值(它也存储在变量a
中)。如果b
评估为实值,则将使用if
分支。
但是,由于=
不是==
,因此linter程序通常如上所述将if
语句标记为潜在错误。开发人员想要==
并错误地键入=
的情况经常发生。短毛猫试图检测出此错误。
如果真正的目的是复制b
中的a
的值,并且还将此值用作if
语句的条件(而不是比较a
到b
),则上面的代码是正确的。有两种方法可以使短绒警告静音:
将分配放在if
语句前面:
a = b
if (a) {
...
}
将作业放在一对括号内:
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))
希望这会有所帮助!