我想问为什么
alert(3>2>1); // (1)
在Javascript中返回FALSE。
我知道正确的是:
alert(3>2 && 2>1); // (2)
但是代码1应该返回错误消息或者为TRUE!这个等式返回FALSE的具体原因是什么?
答案 0 :(得分:36)
如果你添加括号来展示JavaScript如何解释它,它会变得更加清晰:
alert( (3 > 2) > 1 );
让我们分开来看看。首先,它评估3 > 2
。是的,三个大于两个。因此,您现在拥有:
alert( true > 1 );
true
被强制转换为数字。这个数字恰好是1
。 1 > 1
显然是假的。因此,结果是:
alert( false );
答案 1 :(得分:6)
第一个3>2
计算结果为TRUE,可能会隐式转换为1,因此最终会得到1>1
,这是假的。
你可能在这里想要一个错误,但是Javascript的输入非常弱,所以它会尝试进行隐式转换,而不会抱怨。
编辑:
所以你问为什么编程语言语法并不总是与数学符号一致?我会说(1)他们有不同的优先级,(2)编译器以另一种方式做更有意义。
但这并不罕见:
x = 3
(作业)x >> 1
(bitshift)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
答案 4 :(得分:0)
请在下面找到答案
3 > 2 > 1 === true;
>运算符的优先级比===高,并且是从左到右的关联。如果添加隐式括号,则会得到以下结果:
((3 > 2) > 1) === true;
这进一步评估为:
((3 > 2) > 1) === true;
(true > 1) === true;
false === true;
false;