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