7

我期待以下比较给出错误:

var A = B = 0;
if(A == B == 0)
    console.log(true);
else
    console.log(false);

但奇怪的是它返回了false

更奇怪的是,

console.log((A == B == 1)); 

返回true

这种“三元”比较是如何工作的?

4

6 回答 6

8

首先,我们需要了解==数字和布尔值之间的比较会导致布尔值内部类型转换为数字(true变得1false成为0

您显示的表达式是从左到右计算的。所以,首先

A == B

被评估,结果是true,你正在true与 0 进行比较。由于在比较期间true变为11 == 0评估为false. 但是当你说

console.log((A == B == 1));

A == Bis true,当与 number 相比时,变为1并且您再次将其与 1 进行比较。这就是它打印的原因true

于 2014-04-10T06:50:21.623 回答
8

像=这样的赋值运算符是右结合的:当有一系列这样的运算符具有相同的优先级时,它们从右到左处理,所以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

于 2014-04-10T06:54:54.450 回答
2

首先,A == B返回true,然后与 0 进行比较,true == 0返回 false 或true == 1返回 true。

于 2014-04-10T06:49:16.807 回答
2

它首先检查您的子句是否为 A == B,这是真的,然后它开始检查真 == 0,并且 0 是假的。因此,当您检查 A == B == 1 时,您检查 A==B,这是真的,而真 == 1。所以它返回真。如果您真的想检查所有可能性,您应该执行以下操作:

if((A==B) && (A==0))
   console.log(true);
else 
   console.log(false);
于 2014-04-10T06:49:26.157 回答
1
if((A == B)&& (A== 0)&& (B==0))
    console.log(true);
else
    console.log(false);
于 2014-04-10T06:47:34.973 回答
1

你可以从左到右工作。在这种情况下,您首先检查 A == B,然后检查这是否等于 0。因此,由于 A == B,这是真的。所以现在它变成了 (true == 0),这是错误的。如果 A=1,B=2,那么 (A == B == 0) 将返回 true!这是因为 A == B 为假而 (false == 0) 为真!

于 2014-04-10T06:51:48.633 回答