为什么执行"alert(3>2>1)"会弹出"false"?

15

我想询问为什么

alert(3>2>1);  // (1)

在JavaScript中返回FALSE.

我知道正确的写法是:

alert(3>2 && 2>1); // (2)

但是代码 1 应该返回错误消息或者返回 TRUE!这个等式为什么会返回 FALSE?


4
我的猜测是,(1) 被解释为 true > 1,但这只是一种猜测,可能不准确。 - Z. Zlatev
5个回答

40

如果您添加括号以显示JavaScript的解释方式,它会变得更加清晰:

alert( (3 > 2) > 1 );

让我们来逐步分析一下。首先,它计算3 > 2。是的,三比二大。因此,现在你有了这个:

alert( true > 1 );

true会被强制转换成一个数字。这个数字恰好是11 > 1显然是false。因此,结果为:

alert( false );

14
@George - ...因为它并没有坏掉。 - Wayne
2
修复什么?它的功能正常。 - Brian Roach
3
@George - 亲爱的上帝,请注意每个问题只有一个问号。请注意修改。 - Wayne
2
@George: Python不同,比较这些语言是没有意义的。您也可以问为什么Java、C等不能做到这一点。我同意JavaScript 可能 在这里会抛出语法错误。但是动态类型使它成为可能 ;) - Felix Kling
9
乔治,这个结果“并没有错误”——它恰恰是语言规范所规定的。你可以成为下一个大型编程语言的设计者,在你的语言中将一切调整“正确”,或者接受编程语言有其自己的规则和原因。 - Pointy
显示剩余5条评论

7

首先,3>2 的结果为TRUE,可能会被隐式转换为1,因此你最终得到的是 1>1,结果为FALSE。

也许你希望在这里出现一个错误,但Javascript是一种非常弱类型的语言,因此它会尝试进行隐式转换,而不会抱怨。

编辑:

所以你问为什么编程语言的语法不总是与数学符号相一致?我会说(1)它们有不同的优先级和(2)对编译器来说用另一种方式更有意义。

虽然这并不罕见:

  • "x = 3"(语句)和 x = 3(赋值)
  • "x >> 1"(比1大得多)和 x >> 1(位移)
  • "a | b"(a除以b)和 a | b(按位或)。

列表还可以继续...


4

它正在被评估,如下所示:

+(3>2) > 1

这与以下表达是相同的:

+(true) > 1

最终结果是:
1 > 1 = false

但是,至少3>2>0会起作用;)


1
让我们从根本上分解它,它是具有相同优先级的两个 > 运算符,那么哪一个先运行?
JavaScript 有分配运算符优先级,根据从 MDN 下载的运算符优先级表
大于(>) (表中的11) 从左到右运行,所以3>2先运行并评估为TRUE
因此现在我们有 TRUE > 1,
当 JavaScript 看到比较的两种不同类型的值(这里是 bool 和 number),将发生类型强制转换,这意味着 TRUE 将被强制转换(类型转换)为1,
因此 JavaScript 将作为1>1运行,其结果为 FALSE

enter image description here


0
请查看以下答案:
3 > 2 > 1 === true;

> 运算符的优先级高于 ===,并且是从左到右结合的。如果我们添加隐式括号,我们会得到这个:

((3 > 2) > 1) === true;

这将进一步评估为:

((3 > 2) > 1) === true;
(true > 1) === true;
false === true;
false;

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