为什么“警报(3> 2> 1)”警告“错误”

时间:2011-05-01 23:02:17

标签: javascript

我想问为什么

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

在Javascript中返回FALSE。

我知道正确的是:

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

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

5 个答案:

答案 0 :(得分:36)

如果你添加括号来展示JavaScript如何解释它,它会变得更加清晰:

alert( (3 > 2) > 1 );

让我们分开来看看。首先,它评估3 > 2。是的,三个大于两个。因此,您现在拥有:

alert( true > 1 );

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

alert( false );

答案 1 :(得分:6)

第一个3>2计算结果为TRUE,可能会隐式转换为1,因此最终会得到1>1,这是假的。

你可能在这里想要一个错误,但是Javascript的输入非常弱,所以它会尝试进行隐式转换,而不会抱怨。

编辑:

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

但这并不罕见:

  • “x = 3”(声明)和x = 3(作业)
  • “x>> 1”(远远超过1)和x >> 1(bitshift)
  • “a | b”(a除以b)和a | b(按位OR)。

列表继续......

答案 2 :(得分:4)

它的评估如下:

+(3>2) > 1

与以下内容相同:

+(true) > 1

最终是:

1 > 1 = false

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

答案 3 :(得分:0)

让我们从根本上打破它,它的两个>具有相同优先级的运算符,那么哪一个先运行?

JavaScript已分配运算符优先级,根据从中运行的运算符优先级表 MDN

大于(>)(表格中的11)从左向右运行,因此3> 2首先运行,其计算结果为TRUE

现在我们有了TRUE> 1,

当JavaScript看到两种不同类型的值(此处为bool和数字)进行比较时,会发生类型强制,这意味着TRUE将被强制(类型转换)为1,

因此JavaScript将以1> 1运行,结果为FALSE

enter image description here

答案 4 :(得分:0)

请在下面找到答案

3 > 2 > 1 === true;

>运算符的优先级比===高,并且是从左到右的关联。如果添加隐式括号,则会得到以下结果:

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

这进一步评估为:

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