我在jsfiddle.net上玩,我很好奇为什么这个返回真?
if(0 < 5 < 3) { alert("True"); }
这个也一样:
if(0 < 5 < 2) { alert("True"); }
但这不是:
if(0 < 5 < 1) { alert("True"); }
这种怪癖有用吗?
我猜是因为0 < 5为真,而true < 3转换为1 < 3为真。
0 < 5
true < 3
1 < 3
操作顺序导致(0 < 5 < 3)在javascript中被解释为((0 < 5) < 3),产生(true < 3), true被计数为1,导致它返回true。
(0 < 5 < 3)
((0 < 5) < 3)
(true < 3)
这也是为什么(0 < 5 < 1)返回false, (0 < 5)返回true,这被解释为1,导致(1 < 1)。
(0 < 5 < 1)
(0 < 5)
1
(1 < 1)
因为true < 3,因为true == 1
true == 1
可能是因为true被假定为1
true
0 < 5 < 3 --> true < 3 --> 1 < 3 --> true
它是否对0<5求值,当1<3为真时返回1 ?
操作符“<”不能应用于类型为“bool”和“int”的操作数
不久前,我在Obj-C中遇到了这个问题,对此感到非常困惑。通过这样做,我得到了我想要的结果:
if(0 < 5 && 5 < 3) { alert("True");}
这当然是假的,所以你不会得到“真”警报。 很高兴我读了这篇文章,我现在知道为什么了
至于你问的这个怪癖是否有用:我想在某些情况下它是有用的(如果你追求的是压缩代码),但依赖它(很可能)会严重降低代码的可理解性。
这有点像使用后/前递增/递减作为更大表达式的一部分。您能一眼确定这段代码的结果吗?
int x = 5; int result = ++x + x++ + --x;
注意:使用这些代码,有时甚至可以得到不同的结果,这取决于语言和编译器。
让你自己和下一个人的生活更轻松是一个好主意,它将阅读你的代码。清楚地写出你真正想要发生的事情,而不是依赖于副作用,比如布尔值的隐式转换。
这很简单。
从左到右开始,所以它计算第一个0 <5. 这是真的吗?是的。由于TRUE=1,它的值为1 <3.因为1小于3,所以它是正确的。
现在有了这个
0小于5吗?是的。所以设为TRUE,也就是1。现在记住了这个事实,它的值是(1 <1) 1是否小于1?不,因此它是假的。它必须相等。
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项布尔数组:
10 10 11 10
然后对这个布尔结果求和:
+/1 0 1 1 0
得出最终答案:
3.
这个问题是一个很好的例子,说明了这种技术非常有用,特别是当这个问题被推广到确定m个布尔值中的n个是否为真时。
检查三个布尔值中是否至少有两个为真
true + 1 which gives you 2.
因此0 < 5,返回的布尔(true)与数学运算符(<)操作将返回一个数字。所以它归结为1<3,返回true
除了python, CoffeeScript是另一种支持链式比较的语言,因此在vanilla JS中3 < x < 10将被转换为(3 < x && x < 10)
3 < x < 10
(3 < x && x < 10)
因为0小于5,所以返回true,默认情况下,true是任何值,包括并且可以被赋值为1,而1仍然小于3,同样返回true
试着把你的结果写成Number()
if(Number(0) < Number(5) < Number(3)) { alert("True"); }
或者试试这个:
if(Number(0) < Number(5) && Number(5) < Number(3)) { alert("True"); }
我谷歌了一下,因为我得到了(3 >= 20) //returning true,我猜javascript试图检查3作为布尔值,因为我从elm.getAttribute();函数得到这个值,其中console.log();以字符串形式打印。
(3 >= 20) //returning true
3
elm.getAttribute();
console.log();