为什么(0 <5 <3)返回true?

时间:2010-11-03 16:32:55

标签: javascript compare operators boolean-logic

我在jsfiddle.net上玩,我很好奇为什么这会返回true?

if(0 < 5 < 3) {
    alert("True");
}

这样做:

if(0 < 5 < 2) {
    alert("True");
}

但这不是:

if(0 < 5 < 1) {
    alert("True");
}

这个怪癖是否有用?

14 个答案:

答案 0 :(得分:432)

操作顺序导致{j}中的(0 < 5 < 3)被解释为生成((0 < 5) < 3)的{​​{1}},而真实被计为1,导致它返回true。

这也是(true < 3)返回false的原因,(0 < 5 < 1)返回true,被解释为(0 < 5),结果为1

答案 1 :(得分:62)

我的猜测是因为0 < 5为真,而true < 3被强制转换为1 < 3,这是真的。

答案 2 :(得分:21)

可能是因为true被假定为1所以

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true

答案 3 :(得分:17)

因为true < 3,因为true == 1

答案 4 :(得分:10)

关于你的问题这个怪癖是否有用:我认为可能会出现一些有用的情况(如果压缩代码是你所追求的),但依赖它会(很可能)严重降低其可理解性你的代码。

有点像使用post / pre递增/递减作为更大表达式的一部分。你能一眼确定这段代码的结果吗?

int x = 5;
int result = ++x + x++ + --x;

注意:使用此代码,有时甚至可以根据语言和编译器获得不同的结果。

为您自己以及将会阅读您的代码的下一个人让生活变得轻松是一个好主意。清楚地写出你真正想要发生的事情,而不是依赖于隐含的布尔转换等副作用。

答案 5 :(得分:9)

问题第二部分的答案,“这个怪癖是否有用?”也许没有,正如之前的回答所指出的,如果确实是语言(Javascript)的怪癖,则将true转换为1,但程序员通常不会将1和true(以及0和false)视为一样。

如果你的心智模型1为真,0为假,那么它会导致各种非常有用,强大和直接的好布尔技术。例如,您可以直接使用A&gt;的结果递增计数器。 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

This question是这个技术非常有用的完美示例,特别是如果问题被推广以确定m个布尔值中的n是否为真。

Check if at least two out of three booleans are true

答案 6 :(得分:7)

这很容易。

(0 < 5 < 3)

从左到右开始,以便评估第一个0&lt;这是真的吗?是。由于TRUE = 1,因此评估1&lt; 3.因为1小于3所以这是真的。

现在有了这个

 (0 < 5 < 1)

0小于5?是。因此,将其设为TRUE,这也意味着1.现在考虑到这一事实,它评估为(1 <1)。 1小于1?不,因此它是假的。它必须是平等的。

答案 7 :(得分:4)

是否正在评估0&lt; 5,当1&lt; 3为真时,它将返回1为真?

C#想让你这样做“运营商”&lt;'不能应用于'bool'和'int'类型的操作数“

答案 8 :(得分:4)

我不久前在Obj-C遇到过这个问题并且非常困惑。通过做这样的事情,我得到了我想要的结果:

if(0 < 5  && 5 < 3) {
alert("True");}

当然这是假的,所以你不会得到那个“真正的”警报。 很高兴我读到这个,我现在知道为什么了。

答案 9 :(得分:4)

除了python之外,CoffeeScript是另一种支持链式比较的语言,因此3 < x < 10将在vanilla JS中转换为(3 < x && x < 10)

答案 10 :(得分:3)

0 < 5 < 3 
==> ( ( 0 < 5 ) < 3 )
==> true < 3
==> 1 < 3
==> true

答案 11 :(得分:1)

在数学运算符上运算时的布尔操作数返回一个数字。 检查这个我们做

true + 1  which gives you 2.

所以0 < 5,用数学运算符(&lt;)运算的返回布尔值(true)将返回一个数字。所以它沸腾到1&lt; 3,返回true

答案 12 :(得分:0)

因为0小于5则返回true,并且默认情况下true为包含任何内容,并且可以求值为1,仍然小于3再次返回true

答案 13 :(得分:0)

尝试将结果表示为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();函数的{{1} }以字符串形式打印。