为什么(0 <5 <3)返回true?
我在jsfiddle.net上玩耍,我很好奇,为什么这返回true?
if(0 < 5 < 3) { alert("True"); } 那么这样做:
 if(0 < 5 < 2) { alert("True"); } 
但是这不是:
 if(0 < 5 < 1) { alert("True"); } 
这个古怪有用吗?
  (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这是真的。 
 可能是因为假设为1所以 
 0 < 5 < 3 --> true < 3 --> 1 < 3 --> true 
 因为true < 3 ,因为true == 1 
至于你的问题,是否这个怪癖是有用的:我想可能会有一些情况下,它将是有用的(如果浓缩代码是你以后),但依靠它(很可能)会严重降低你的代码的可理解性。
这就像使用post / pre增量/减量作为更大expression式的一部分。 你能确定一下这个代码的结果吗?
 int x = 5; int result = ++x + x++ + --x; 
注意:使用这段代码,根据语言和编译器的不同,有时甚至会得到不同的结果。
让自己和下一个会阅读你的代码的人生活变得很容易是一个好主意。 清楚地写出你真正想要发生的事情,而不是像布尔的隐式转换那样依赖副作用。
问题第二部分的答案是“这个怪癖有用吗?” 正如前面的回答所指出的,如果确实是语言(Javascript)的一个怪癖,那么真的投射到1,但是程序员并不是普遍地认为1和真的(和0和假的)一样。
但是,如果你有一个真实的心智模型,0是假的,那么它会导致各种各样的非常有用,强大和直接的布尔技巧。 例如,你可以用A> 100的结果直接递增一个计数器,如果A大于100,这个计数器就会递增。这个技术可能被看作是Java中的一个怪癖或者窍门,但是在数组或者函数式语言中可能是惯用的。
数组语言APL中的一个典型例子是计算数组中(例如)大于100的项数:
 +/A>100 
如果A是5项目arrays107 22 256 110 3则:
 A>100 
产生5个项目的布尔数组:
1 0 1 1 0
并总结这个布尔结果:
 +/1 0 1 1 0 
得出最后的答案:
3
这个问题是一个很好的例子,说明这个技术是非常有用的,特别是如果问题被推广到确定m个布尔值是否为真。
检查三个布尔值中的至less两个是否为真
这很容易。
 (0 < 5 < 3) 
从左到右开始评估第一个0 <5。是真的吗? 是。 由于TRUE = 1,它评估1 <3。因为1小于3,所以是真的。
现在这个
  (0 < 5 < 1) 
是小于5吗? 是。 因此,使其成为TRUE,这也意味着1.现在考虑到这一事实,它评估为(1 <1)。 1小于1? 不,所以这是错误的。 它必须是平等的。
是否评估0 <5,当1 <3这是真的时,会返回1为真?
C#想让你这样做“运算符”<“不能应用于types”布尔“和”整型“的操作数
我不久前在Obj-C遇到过这个问题,非常困惑。 我通过做这样的事情得到了我想要的结果:
 if(0 < 5 && 5 < 3) { alert("True");} 
当然这是错误的,所以你不会得到这个“真实”的警报。 很高兴我读到这个,我现在知道为什么。
 除python之外,CoffeeScript是另一种支持链式比较的语言,因此3 < x < 10将被转换为(3 < x && x < 10)在香草JS 
 0 < 5 < 3 ==> ( ( 0 < 5 ) < 3 ) ==> true < 3 ==> 1 < 3 ==> true 
通过math运算符操作时的布尔操作数返回一个数字。 检查我们做的
 true + 1 which gives you 2. 
 所以0 < 5 ,用math运算符(<)操作的返回布尔值(true)将返回一个数字。 所以它沸腾到1 <3这返回true