为什么(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