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

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

这个也一样:

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

但这不是:

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

这种怪癖有用吗?


当前回答

它的值是0<5当1<3为真时返回1为真吗?

操作符“<”不能应用于类型为“bool”和“int”的操作数

其他回答

不久前,我在Obj-C中遇到了这个问题,对此感到非常困惑。通过这样做,我得到了我想要的结果:

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

这当然是假的,所以你不会得到“真”警报。 很高兴我读了这篇文章,我现在知道为什么了。

问题的第二部分,“这个怪癖有用吗?”的答案可能是否定的,正如前面的答案所指出的,如果它确实是语言(Javascript)的怪癖,true被转换为1,但程序员通常不认为1和true(以及0和false)是一回事。

然而,如果你有一个1为真,0为假的心理模型,那么它就会导致各种各样非常有用、强大和直接的布尔技术。例如,您可以直接使用a > 100的结果递增计数器,如果a大于100则递增计数器。这种技术在Java中可能被视为一种怪癖或技巧,但在数组或函数语言中可能是惯用的。

数组语言APL中的一个经典示例是计算数组中(比如说)大于100的项的数量:

+/A>100

其中如果A是5项数组107 22 256 110 3,则:

A>100

产生5项布尔数组:

1, 0, 1, 1, 0

然后对这个布尔结果求和:

+/1 0 1 1 0

得出最终答案:

3

这个问题是这个技术非常有用的一个完美的例子,特别是当这个问题被推广到确定m个布尔值中的n个是否为真时。

检查三个布尔值中是否至少有两个为真

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

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

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

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

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

可能是因为true被假设为1

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

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

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