我在jsfiddle.net上玩,我很好奇为什么这个返回真?
if(0 < 5 < 3) {
alert("True");
}
这个也一样:
if(0 < 5 < 2) {
alert("True");
}
但这不是:
if(0 < 5 < 1) {
alert("True");
}
这种怪癖有用吗?
我在jsfiddle.net上玩,我很好奇为什么这个返回真?
if(0 < 5 < 3) {
alert("True");
}
这个也一样:
if(0 < 5 < 2) {
alert("True");
}
但这不是:
if(0 < 5 < 1) {
alert("True");
}
这种怪癖有用吗?
当前回答
除了python, CoffeeScript是另一种支持链式比较的语言,因此在vanilla JS中3 < x < 10将被转换为(3 < x && x < 10)
其他回答
可能是因为true被假设为1
0 < 5 < 3 --> true < 3 --> 1 < 3 --> true
因为0小于5,所以返回true,默认情况下,true是任何值,包括并且可以被赋值为1,而1仍然小于3,同样返回true
布尔操作数在数学运算符上操作时返回一个数字。 为了验证这一点,我们做了
true + 1 which gives you 2.
所以0 < 5,用数学运算符(<)操作返回的布尔值(true)将返回一个数字。结果是1<3,返回true
0 < 5 < 3
==> ( ( 0 < 5 ) < 3 )
==> true < 3
==> 1 < 3
==> 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个是否为真时。
检查三个布尔值中是否至少有两个为真