进行三重比较时会发生什么? (JavaScript)

时间:2018-09-28 12:33:25

标签: javascript comparison-operators

首先,我知道这不是一个应该进行比较的方式,这只是一个有趣的问题。 假设您进行了以下比较:

var x = 0;
if(1 < x < 3) {
  console.log("true");
} else {
  console.log("false");
}

该if语句内部发生了什么,因此输出为“ true”? 是否发生一些隐式逻辑比较。以及如何找出答案?

2 个答案:

答案 0 :(得分:3)

比较是从左到右进行的,因此1 < x < 3的评估结果为

1 < x首先是false,因为x0。下一步比较是

false < 3将为true,因为将进行false到数字表示形式0的隐式类型转换。因此,表达式的计算结果为0 < 3的{​​{1}}。

因此,当您执行truetrue < 3时,此布尔值将隐式转换为false < 3的{​​{1}}和{{1} }。

答案 1 :(得分:0)

根据ECMAScript® 2018 Language Specification(7.2.14),这种比较方式如下:

  

7.2.14抽象平等比较   如果Type(x)与Type(y)相同,则

     

返回执行严格相等比较x === y的结果。

     

如果x为空且y未定义,则返回true。

     

如果x未定义且y为空,则返回true。

     

如果Type(x)为Number而Type(y)为String,则返回结果   比较x ==! ToNumber(y)。

     

如果Type(x)为字符串,Type(y)为Number,则返回结果   比较! ToNumber(x)== y。

     

如果Type(x)为布尔值,则返回比较结果!    ToNumber(x)== y

     

如果Type(y)为Boolean,则返回比较结果x ==!   ToNumber(y)。

     

如果Type(x)是字符串,数字或符号,而Type(y)是Object,   返回比较结果x == ToPrimitive(y)。

     

如果类型(x)是对象,类型(y)是字符串,数字或符号,   返回比较结果ToPrimitive(x)== y。

     

返回false。

并且:

  

7.1.3 ToNumber(参数):如果参数为true,则返回1。如果参数为false,则返回+0

(粗体是我的)

所以:

(1 < 0 ) < 3
 false   < 3
   0     < 3
    true