JavaScript比较运算符

3
我来自 Python 背景,在做 JavaScript 项目时遇到了一个问题,即:

0 < 5 < 3

输出结果为 true。我的猜测是它只运行了第一个操作符而完全忽略了第二个操作符。

在 Python 中,这会被渲染为 false。

我不关心如何让它起作用,但奇怪的是它没有在文档中解释清楚,只是暗示应该使用 (0 < x && x < 3 ) 来保持简单。

我猜我的问题是,如果有人能回答的话,为什么会这样?


“简单”是一个相对的术语。人类读者可能会发现将“0 < 5 < 3”解释为“0 < 5且5 < 3”很简单,但计算机可能会更容易地将其解释为“(0 < 5) < 3”。 - Kevin
3个回答

5
在JavaScript中,this指的是:
0 < 5 < 3

如下所示进行评估:

(0 < 5) < 3

这意味着:

true < 3

这会进一步将其翻译为以下内容(因为在数值上下文中,true 等同于 1):

1 < 3

这是真的。


然而,Python 的设计方式不同。正如这里所记录的那样,它解释了这个:

0 < 5 < 3

被视为等同于这个:

0 < 5 and 5 < 3

以上表达式可以进一步翻译为:

True and False

这是错误的。


这完全有道理,只是因为我过去两年一直在使用Python,所以从未遇到过这个问题。谢谢! - cronicryo

2
这是一步一步的评估。当使用<比较数字和布尔值时,true变成1,false变成0。
0 < 5 < 3 // =>
true < 3 // =>
Number(true) < 3 // =>
1 < 3 // =>
true

请参见规范11.8.5,第3条规则,该规则描述了ToNumber强制类型转换。

3)如果不是Type(px)为String且Type(py)为String,则

a)让nx成为调用ToNumber(px)的结果。因为px和py是原始值,所以求值顺序无关紧要。

b)让ny成为调用ToNumber(py)的结果。


0

在JavaScript中,关系运算符从左到右执行:

0 < 5

将会是真的,即1,因此

0 < 5 < 3

翻译成:

1 < 3

这是真的。

另一方面,Python中的比较操作具有相同的优先级。

与C不同的是,像a < b < c这样的表达式在数学上有传统的解释。


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