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

Geo*_*rge 10 javascript

我想问为什么

alert(3>2>1);  // (1)
Run Code Online (Sandbox Code Playgroud)

在Javascript中返回FALSE.

我知道正确的是:

alert(3>2 && 2>1); // (2)
Run Code Online (Sandbox Code Playgroud)

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

ick*_*fay 37

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

alert( (3 > 2) > 1 );
Run Code Online (Sandbox Code Playgroud)

让我们分开吧.首先,它进行评估3 > 2.是的,三个大于两个.因此,你现在有这个:

alert( true > 1 );
Run Code Online (Sandbox Code Playgroud)

true被强迫变成一个数字.这个数字恰好是1.1 > 1显然是假的.因此,结果是:

alert( false );
Run Code Online (Sandbox Code Playgroud)

  • @George - ...因为它没有被打破. (13认同)
  • @George结果**没有错** - 这正是语言规范所说的应该是什么.无论是成为下一个大语言的设计者,在你的东西中设置"正确"的东西,或者接受编程语言都有自己的原因. (8认同)
  • @George - 另外,对于上帝的爱,请问每个问题一个问号. (3认同)
  • 修什么?它可以正常工作。 (2认同)
  • @George:Python不同,比较这些语言没有意义.您也可以问为什么Java,C等不能这样做.我同意JavaScript*可能会在这里抛出语法错误.但动态打字使它成为可能;) (2认同)

Gus*_*son 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).

名单继续......