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

359

我在jsfiddle.net上玩耍,想知道为什么这会返回true?

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

那么这个也是一样的:

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

但这个不行:

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

这种怪癖有用处吗?


14
你知道 http://wtfjs.com/ 吗? - Harmen
1
哈!不,我以前从未见过那个。 - punkrockbuddyholly
啊,隐式类型转换的乐趣。 - Jörg W Mittag
4
有用吗?可能适用于混淆。 :-) - Icode4food
为什么?此外,任何东西都是有用的,只要你能找到需要它的情况。确实,这个工具比许多其他工具更少被需要,但有时候,虽然可能很少,但它可能正好是完成工作的工具。 - temporary_user_name
15个回答

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

1

当布尔操作数与数学运算符一起使用时,会返回一个数字。为了检查这一点,我们可以执行以下操作:

true + 1  which gives you 2.

所以,由于0 < 5,与数学运算符(<)操作的布尔值(true)将返回一个数字。因此它可以归结为1<3,其返回true

1
因为0小于5,所以返回true,默认情况下true是任何包括1在内的东西,可以被评估为1,这仍然小于3,再次返回true。

0
我也遇到了同样的问题。
代码:
// Case 1
console.log(1 < 2 < 3); // true
// Case 2
console.log(3 > 2 > 1); // false

在JavaScript中,Case 1和Case 2都涉及到链接比较运算符,由于JavaScript根据运算符优先级和结合性处理它们的方式,它们的行为可能看起来与直觉相反。
案例1:console.log(1 < 2 < 3); // true 这个表达式的计算结果是(1 < 2) < 3。 首先,1 < 2 是true(在JavaScript中,true可以被隐式转换为数值1进行比较)。 然后,true与3进行比较时,会被强制转换为数值,结果为1 < 3,也就是true。 因此,最终的输出结果是true。
案例2:console.log(3 > 2 > 1); // false 这个表达式的计算结果是(3 > 2) > 1。 首先,3 > 2 是true。 然后,true与1进行比较时,会被强制转换为数值,结果为1 > 1,也就是false。 因此,最终的输出结果是false。
这种行为可能会令人困惑,因为JavaScript具有隐式类型转换和比较运算符的从左到右结合性,当将这些操作链接在一起时,可能会导致意外的结果。

1
欢迎来到Stack Overflow!感谢您的回答。请提供更多关于您解决方案的细节。代码片段、高质量的描述或任何相关信息都会很好。对于每个人来说,清晰简明的答案更有帮助且更易理解。请通过编辑您的回答,提供具体细节以提高您的回答质量。更多信息请参考如何:撰写好的答案。祝您编码愉快! - undefined
@AztecCodes 这是更新并解释过的答案。祝你编程愉快! - undefined

-1

尝试将您的结果表述为Number()

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

或者尝试这个:

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

我搜索了一下这个问题,因为我得到的结果是(3 >= 20) //返回true,我猜JavaScript想把值3当做布尔类型来检查,因为这个值是从elm.getAttribute();函数获取的,并且console.log();以字符串形式打印出来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接