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

IT技术 javascript compare operators boolean-logic
2021-02-03 05:34:36

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

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

这样做也是如此:

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

但这不会:

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

这个怪癖有用吗?

6个回答

操作顺序导致(0 < 5 < 3)在 javascript 中被解释为((0 < 5) < 3)哪个产生(true < 3)并且 true 被计为 1,导致它返回 true。

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

您在我编辑问题以添加if(0 < 5 < 1) == false. 现在一切都清楚了,谢谢:)
2021-03-20 05:34:36
确切地说,Python 是我所知道的唯一将这种语法视为 的语言((0 < 5) && (5 < 3)),可能还有其他语言,但我不知道。
2021-03-25 05:34:36
@Alan:Mathematica 是另一个例子。
2021-03-29 05:34:36
恕我直言,JavaScript 在尝试将布尔值与数字进行比较时应该引发 TypeError,因为它没有意义。
2021-04-02 05:34:36
因为 JavaScript 不是 Python。:-)
2021-04-10 05:34:36

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

这里没有演员。强制转换是一种运算符,程序员使用它来显式检查类型。这是从布尔值到整数的隐式转换。
2021-03-13 05:34:36
@erickson,真的……我们需要在这里纠结语义吗?
2021-03-20 05:34:36
一路上都是诡辩家......无论如何,回复是“简洁”的;)
2021-03-24 05:34:36
在任何情况下,正确的术语是coercion是的,埃里克森的绝对确定性是部分错误的。强制转换在任何情况下也是一种类型转换,如果通常(但它只是一种约定)您使用“转换”一词来表达显式类型转换。类型转换 == 类型转换。
2021-03-25 05:34:36
不要担心埃里克森。我也滥用语义这个词。:)
2021-03-29 05:34:36

可能是因为true假设1如此

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

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

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

这有点像使用 post/pre increment/decrement 作为更大表达式的一部分。你能一眼就判断出这段代码的结果是什么吗?

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

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

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

@MrMisterMan:我对 Javascript 不太确定,但在 Java 和 C# 中,评估保证从左到右,结果确实是 18。在某些语言中,例如 C 和 C++,不能保证它会是从左到右评估,根据编译器添加的优化,您最终可能会得到不同的结果。
2021-03-14 05:34:36
出于好奇,是result18 岁吗?
2021-03-27 05:34:36