我期望以下比较会给出错误:
var A = B = 0;
if(A == B == 0)
console.log(true);
else
console.log(false);
但奇怪的是它返回了
false
。
更奇怪的是,
console.log((A == B == 1));
返回
true
。
这种“三元”比较是如何进行的?
首先,我们需要了解数字和布尔值之间的
==
比较将导致布尔值到数字的内部类型转换(true
变为1
,false
变为0
)
您显示的表达式是从左到右计算的。所以,首先
A == B
计算 ,结果为
true
,并且您将 true
与 0 进行比较。由于在比较过程中 true
变为 1
,因此 1 == 0
计算结果为 false
。但当你说
console.log((A == B == 1));
A == B
是 true
,与数字比较时,变成 1
,您再次将其与 1 进行比较。这就是为什么它打印 true
。
像=这样的赋值运算符是右关联:当存在一系列具有相同优先级的这些运算符时,它们是从右到左处理的,因此
A = B = 0
被处理为A = (B = 0)
(B = 0
返回0,所以 A 和 B 最终都为 0)。
像 == 这样的相等运算符是 左关联:相同优先级运算符从左到右处理。
A == B == 0
被处理为 (A == B) == 0
,并且由于 A == B
为 true (1),因此它变为 1 == 0
,为 false (0)。
同样,
A == B == 1
被处理为(A == B) == 1
,变成1 == 1
,这是正确的(1)。
来源和更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
首先,
A == B
返回true
,然后与 0 进行比较,true == 0
返回 false,或 true == 1
返回 true。
它首先检查你的子句是否 A == B,这是真的,然后它开始检查 true == 0,而 0 是假。因此,当您检查 A == B == 1 时,您检查 A==B,这是 true,并且 true == 1。因此它返回 true。如果你真的想检查所有可能性,你应该这样做:
if((A==B) && (A==0))
console.log(true);
else
console.log(false);
if((A == B)&& (A== 0)&& (B==0))
console.log(true);
else
console.log(false);
您可以从左到右工作。在这种情况下,您首先检查 A == B 是否存在,然后检查它是否等于 0。因此,由于 A == B,这是 true。所以现在变成了 (true == 0),这是 false。如果 A=1,B=2,则 (A == B == 0) 将返回 true!这是因为 A == B 为假,而 (false == 0) 为真!
我相信你在这里只需要进行两次比较,但它们确实需要是独立的。所以只需检查:
(A==B && B=0) ? {如果为 true 则发生这种情况} : {如果为 False 则发生这种情况}
这应该与三重比较相同,除非您有第三个条件,即“B === 0 and A !== 0”与“A === 0 and B !== 0”不同,从而消除了需要比较A和0。