首先,我知道这不是一个应该进行比较的方式,这只是一个有趣的问题。 假设您进行了以下比较:
var x = 0;
if(1 < x < 3) {
console.log("true");
} else {
console.log("false");
}
该if语句内部发生了什么,因此输出为“ true”? 是否发生一些隐式逻辑比较。以及如何找出答案?
答案 0 :(得分:3)
比较是从左到右进行的,因此1 < x < 3
的评估结果为
1 < x
首先是false
,因为x
是0
。下一步比较是
false < 3
将为true
,因为将进行false
到数字表示形式0
的隐式类型转换。因此,表达式的计算结果为0 < 3
的{{1}}。
因此,当您执行true
或true < 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