我期待以下比较会出错:
var A = B = 0;
if(A == B == 0)
console.log(true);
else
console.log(false);
但奇怪的是它返回false
。
更奇怪的是,
console.log((A == B == 1));
返回true
。
这种“三元”比较是如何工作的?
我期待以下比较会出错:
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
is true
,当与 number 相比时,它变成了1
,你再次将它与 1 进行比较。这就是为什么它打印true
.
= 等赋值运算符是右结合的:当有一系列具有相同优先级的运算符时,它们从右到左进行处理,因此A = B = 0
处理为A = (B = 0)
(B = 0
返回 0,因此 A 和 B 最终都为 0) .
== 等等式运算符是左结合的:相同优先级的运算符从左到右处理。A == B == 0
处理为(A == B) == 0
,并且由于A == B
为真 (1),因此变为1 == 0
,为假 (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 进行比较,0true == 0
返回 false 或true == 1
返回 true。
它首先检查您的子句是否为 A == B,这是真的,然后它开始检查 true == 0,而 0 是假的。因此,当您检查 A == B == 1 时,您检查 A==B,这是真的,并且 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);