我在jsfiddle.net上玩,我很好奇为什么这个返回真?

if(0 < 5 < 3) {
    alert("True");
}

这个也一样:

if(0 < 5 < 2) {
    alert("True");
}

但这不是:

if(0 < 5 < 1) {
    alert("True");
}

这种怪癖有用吗?


当前回答

可能是因为true被假设为1

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true

其他回答

因为0小于5,所以返回true,默认情况下,true是任何值,包括并且可以被赋值为1,而1仍然小于3,同样返回true

除了python, CoffeeScript是另一种支持链式比较的语言,因此在vanilla JS中3 < x < 10将被转换为(3 < x && x < 10)

至于你问的这个怪癖是否有用:我想在某些情况下它是有用的(如果你追求的是压缩代码),但依赖它(很可能)会严重降低代码的可理解性。

这有点像使用后/前递增/递减作为更大表达式的一部分。您能一眼确定这段代码的结果吗?

int x = 5;
int result = ++x + x++ + --x;

注意:使用这些代码,有时甚至可以得到不同的结果,这取决于语言和编译器。

让你自己和下一个阅读你代码的人的生活变得简单是一个好主意。清楚地写出你真正想要发生的事情,而不是依赖于副作用,比如布尔值的隐式转换。

操作顺序导致(0 < 5 < 3)在javascript中被解释为((0 < 5)< 3),产生(true < 3), true被计数为1,导致它返回true。

这也是为什么(0 < 5 < 1)返回false,(0 < 5)返回true,这被解释为1,导致(1 < 1)。

我猜是因为0 < 5为真,而true < 3转换为1 < 3为真。