我想询问为什么
alert(3>2>1); // (1)
在JavaScript中返回FALSE.
我知道正确的写法是:
alert(3>2 && 2>1); // (2)
但是代码 1 应该返回错误消息或者返回 TRUE!这个等式为什么会返回 FALSE?
我想询问为什么
alert(3>2>1); // (1)
在JavaScript中返回FALSE.
我知道正确的写法是:
alert(3>2 && 2>1); // (2)
但是代码 1 应该返回错误消息或者返回 TRUE!这个等式为什么会返回 FALSE?
如果您添加括号以显示JavaScript的解释方式,它会变得更加清晰:
alert( (3 > 2) > 1 );
让我们来逐步分析一下。首先,它计算3 > 2
。是的,三比二大。因此,现在你有了这个:
alert( true > 1 );
true
会被强制转换成一个数字。这个数字恰好是1
。1 > 1
显然是false。因此,结果为:
alert( false );
首先,3>2
的结果为TRUE,可能会被隐式转换为1,因此你最终得到的是 1>1
,结果为FALSE。
也许你希望在这里出现一个错误,但Javascript是一种非常弱类型的语言,因此它会尝试进行隐式转换,而不会抱怨。
编辑:
所以你问为什么编程语言的语法不总是与数学符号相一致?我会说(1)它们有不同的优先级和(2)对编译器来说用另一种方式更有意义。
虽然这并不罕见:
x = 3
(赋值)x >> 1
(位移)a | b
(按位或)。 列表还可以继续...
它正在被评估,如下所示:
+(3>2) > 1
这与以下表达是相同的:
+(true) > 1
1 > 1 = false
但是,至少3>2>0
会起作用;)
3 > 2 > 1 === true;
> 运算符的优先级高于 ===,并且是从左到右结合的。如果我们添加隐式括号,我们会得到这个:
((3 > 2) > 1) === true;
这将进一步评估为:
((3 > 2) > 1) === true;
(true > 1) === true;
false === true;
false;
true > 1
,但这只是一种猜测,可能不准确。 - Z. Zlatev