我期待以下比较给出错误:
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 进行比较,true == 0
返回 false 或true == 1
返回 true。
它首先检查您的子句是否为 A == B,这是真的,然后它开始检查真 == 0,并且 0 是假的。因此,当您检查 A == B == 1 时,您检查 A==B,这是真的,而真 == 1。所以它返回真。如果您真的想检查所有可能性,您应该执行以下操作:
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 == 0),这是错误的。如果 A=1,B=2,那么 (A == B == 0) 将返回 true!这是因为 A == B 为假而 (false == 0) 为真!