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

Why does (0 < 5 < 3) return true?

提问人:punkrockbuddyholly 提问时间:11/4/2010 最后编辑:Michał Perłakowskipunkrockbuddyholly 更新时间:11/17/2023 访问量:13515

问:

我在 jsfiddle.net 里玩,我很好奇为什么这又是真的?

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

这也是如此:

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

但这并不意味着:

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

这个怪癖有用吗?

JavaScript 比较 运算符 布尔逻辑

评论

14赞 Harmen 11/4/2010
你知道 wtfjs.com 吗?
1赞 punkrockbuddyholly 11/4/2010
医 管 局!不,我以前从未见过。
0赞 Jörg W Mittag 11/4/2010
啊,隐式类型转换的乐趣。
4赞 Icode4food 11/4/2010
有用吗?可能是为了混淆。:-)
0赞 temporary_user_name 7/28/2012
为什么?此外,如果您只能找到需要它的情况,那么任何事情都是有用的。诚然,与许多其他工具相比,这个工具的需要频率较低,但有时,尽管它们可能很少,但可能恰恰是这项工作的工具。

答:

64赞 CaffGeek 11/4/2010 #1

我的猜测是,因为是真的,并被投射到哪个是真的。0 < 5true < 31 < 3

评论

7赞 erickson 11/5/2010
这里没有选角。强制转换是一个运算符,程序员使用它来显式检查类型。这是从布尔值到整数的隐式转换。
4赞 CaffGeek 11/5/2010
@erickson,真的......我们需要在这里挂断语义吗?
2赞 Mateen Ulhaq 11/5/2010
不要担心埃里克森。我也误用了语义这个词。:)
10赞 Jack 11/6/2010
无论如何,正确的术语是胁迫。是的,埃里克森的绝对确定性部分是错误的。在任何情况下,强制也是一种强制转换,如果通常(但这只是一种惯例)您使用“强制转换”一词来表示显式类型转换。类型转换 == 类型转换。
1赞 Arman 6/19/2013
诡辩家一路走来......无论如何,回复是“简洁”的好;)
453赞 Alan Geleynse 11/4/2010 #2

操作顺序导致在 javascript 中被解释为 produce 和 true 计为 1,导致它返回 true。(0 < 5 < 3)((0 < 5) < 3)(true < 3)

这也是为什么返回 false,返回 true,这被解释为 ,导致 。(0 < 5 < 1)(0 < 5)1(1 < 1)

评论

161赞 rsenna 11/4/2010
而且因为 JavaScript 不是 Python。:-)
1赞 punkrockbuddyholly 11/4/2010
您在我编辑问题以添加 .现在一切都清楚了,谢谢:)if(0 < 5 < 1) == false
28赞 Alan Geleynse 11/4/2010
确切地说,Python 是我所知道的唯一一种将这种语法视为 的语言,可能还有其他语言,但我不知道它们。((0 < 5) && (5 < 3))
18赞 Joren 11/4/2010
@Alan:Mathematica 是另一个例子。
2赞 Michał Perłakowski 1/10/2016
恕我直言,JavaScript 在尝试将布尔值与数字进行比较时应该引发 TypeError,因为它没有意义。
18赞 Harmen 11/4/2010 #3

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

22赞 Jack 11/4/2010 #4

可能是因为假设是这样true1

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true
4赞 David 11/4/2010 #5

它是否计算 0<5 当 1<3 为 true 时,它会返回 1 表示 true?

C# 想要让你这样做“运算符'<'不能应用于'bool'和'int'类型的操作数”

评论

0赞 Arman 6/19/2013
有时我怀念 C# 在动态语言中的严格性。
4赞 Hippocrates 11/4/2010 #6

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

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

这当然是错误的,因此您不会收到“真实”警报。 很高兴我读到了这篇文章,我现在知道为什么了。

11赞 Zach Johnson 11/4/2010 #7

至于你的问题,这个怪癖是否有用:我想在某些情况下它可能会有用(如果你追求的是压缩代码),但依赖它会(很可能)严重降低你的代码的可理解性。

这有点像使用后/前递增/递减作为更大表达式的一部分。你能一目了然地确定这段代码的结果是什么吗?

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

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

让自己和下一个阅读你的代码的人的生活变得轻松是个好主意。清楚地写出你真正想要发生的事情,而不是依赖副作用,比如布尔值的隐式转换。

评论

0赞 punkrockbuddyholly 11/5/2010
出于好奇,是 18 岁吗?result
6赞 Zach Johnson 11/6/2010
@MrMisterMan:我不确定 Javascript,但在 Java 和 C# 中,评估保证是从左到右,结果确实是 18。在某些语言(如 C 和 C++)中,不能保证它会从左到右进行计算,并且根据编译器添加的优化,您最终可能会得到不同的结果。
7赞 netrox 11/4/2010 #8

这很简单。

(0 < 5 < 3)

从左到右开始,这样它就会评估前 0 < 5。是真的吗?是的。由于 TRUE=1,因此计算 1 < 3。由于 1 小于 3,所以这是真的。

现在有了这个

 (0 < 5 < 1)

0 小于 5 吗?是的。所以让它成为 TRUE,这也意味着 1。现在考虑到这一事实,它的计算结果为 (1 < 1)。1 小于 1 吗?不,因此它是错误的。它必须是平等的。

3赞 truease.com 11/9/2010 #9
0 < 5 < 3 
==> ( ( 0 < 5 ) < 3 )
==> true < 3
==> 1 < 3
==> true
9赞 PAUL Mansour 11/27/2010 #10

问题的第二部分,“这个怪癖有用吗?”的答案是否定的,正如前面的答案所指出的那样,如果确实是语言(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 项布尔数组:

1 0 1 1 0

并求和这个布尔结果:

+/1 0 1 1 0

得出最终答案:

3

这个问题是一个完美的例子,说明这种技术在哪些方面非常有用,特别是如果问题被推广以确定 m 个布尔值中的 n 个是否为真。

检查至少三分之二的布尔值是否为真

1赞 Rajkamal Subramanian 12/6/2011 #11

布尔运算数在对数学运算符进行操作时返回一个数字。 为了检查这一点,我们这样做

true + 1  which gives you 2.

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

4赞 Hippocrates 10/30/2012 #12

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

1赞 ndotie 7/30/2018 #13

因为 0 小于 5,所以返回 true,默认情况下 true 是任何内容,包括 和 可以计算为 1,它仍然小于 3,再次返回 true

-1赞 SwiftNinjaPro 9/21/2019 #14

尝试将结果表述为 Number()

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

或者试试这个:

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

我用谷歌搜索了这个,因为我得到了,我猜 javascript 正试图检查为布尔值,因为我从以 String 形式打印的函数中获取了这个值。(3 >= 20) //returning true3elm.getAttribute();console.log();

0赞 CodeMaven42 11/13/2023 #15

我也面临同样的事情。

法典:

// Case 1
console.log(1 < 2 < 3); // true
// Case 2
console.log(3 > 2 > 1); // false

在 JavaScript 中,案例 1 和案例 2 都涉及链接比较运算符,由于 JavaScript 根据运算符优先级和关联性处理它们的方式,这种行为可能看起来有悖常理。

  1. 案例 1: console.log(1 < 2 < 3); // true

    • 其计算结果为 。(1 < 2) < 3
    • 首先,是真的(在JavaScript中,可以在数字比较中隐式转换为)。1 < 2true1
    • 然后,当与 相比时,被强制转换为数值,从而得到 ,这是真的。true31 < 3
    • 因此,最终输出为 。true
  2. 案例 2: console.log(3 > 2 > 1); // false

    • 其计算结果为 。(3 > 2) > 1
    • 首先,是真的()。3 > 2true
    • 然后,当与 相比时被强制成数值,导致 ,这是假的。true11 > 1
    • 因此,最终输出为 。false

由于 JavaScript 的隐式类型强制和比较运算符的从左到右关联性,这种行为可能会令人困惑,这可能会导致将这些操作链接在一起时出现意外结果。

评论

1赞 AztecCodes 11/17/2023
欢迎来到 Stack Overflow!谢谢你的回答。请提供有关您的解决方案的更多详细信息。代码片段、高质量的描述或任何相关信息都会很棒。清晰简洁的答案对每个人来说都更有帮助,更容易理解。用细节编辑你的答案,以提高你的答案质量。有关更多信息:如何:写出好的答案。祝您编码愉快!
0赞 CodeMaven42 11/17/2023
@AztecCodes这里是更新和解释的答案。祝您编码愉快!