我期待以下比较给出错误:
var A = B = 0;
if(A == B == 0)
console.log(true);
else
console.log(false);
但奇怪的是它会返回false
。
更奇怪的是,
console.log((A == B == 1));
返回true
。
这是什么"三元"那种比较工作?
答案 0 :(得分:6)
首先,我们需要了解数字和布尔值之间的==
比较将导致布尔值的内部类型转换为数字(true
变为1
和{ {1}}变为false
)
您显示的表达式从左到右进行评估。所以,首先
0
评估,结果为A == B
,您将true
与0进行比较。由于true
在比较期间变为true
,1
评估为{{ 1}}。但是当你说
1 == 0
false
为console.log((A == B == 1));
,与数字相比,变为A == B
,您将再次与1进行比较。这就是它打印true
。
答案 1 :(得分:6)
= =的分配运算符右关联:当有一系列具有相同优先级的运算符时,它们从右向左处理,因此处理A = B = 0
as 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
答案 2 :(得分:2)
首先,A == B
返回true
,然后将其与0进行比较,true == 0
返回false,或true == 1
返回true。
答案 3 :(得分:2)
它首先检查你的子句A == B,这是真的,而不是它开始检查true == 0,而0是假。所以当你检查A == B == 1时,你检查A == B,这是真的,而真是== 1.那么它返回true。如果你真的想检查所有可能性,你应该做这样的事情:
if((A==B) && (A==0))
console.log(true);
else
console.log(false);
答案 4 :(得分:1)
if((A == B)&& (A== 0)&& (B==0))
console.log(true);
else
console.log(false);
答案 5 :(得分:1)
您可以从左到右工作。在这种情况下,首先检查A == B,然后检查是否等于0.因此,由于A == B,这是真的。所以现在变成(true == 0),这是假的。如果A = 1,B = 2,则(A == B == 0)将返回true!这是因为A == B为假,(假= = 0)为真!