间隔比较不会在JS中轰炸

时间:2018-11-15 13:12:47

标签: javascript boolean intervals

为什么JavaScript中没有间隔比较炸弹?

if(-1 < x < 1) {
  console.log('x: ', x)
}

为什么我们允许这样做而不会出错?

另外,似乎:

  • -1 < x < 1适用于x<=-1
  • 1 < x < 1适用于x<=1
  • -1 < x < -1始终为假
  • -2 < x < 2始终为真

在最后两种情况下,似乎只是比较表达式的2个末端。这些表达式如何计算?

3 个答案:

答案 0 :(得分:3)

因为JavaScript允许隐式类型强制,在这种情况下,从布尔到数字。 -1 < x产生一个布尔值,然后将其(result) < 1隐式强制为一个数字(true = 1,false = 0)。所以:

  • 如果-1 < x为假,则第二部分为0 < 1,这是正确的。

  • -1 < x为true时,第二部分为1 < 1,它为false。

此规范的abstract relational comparison算法及其链接的各种操作对此进行了介绍。

-1 < x < -1 is always false
-2 < x < 2 is always true
     

在最后两种情况下,似乎只是比较表达式的2个末端。这些表达式如何计算?

使用x = -1x = 1

  • 如果x = -1,则-1 < x为假,其余为0 < -1,这为假。
  • 如果x = 1-1 < 1为真,则其余为1 < -1,为假。
  • 如果x = -1-2 < -1为真,则其余为1 < -2,为假。
  • 如果x = 1-2 < 1为真,则其余为1 < -2,为假。

答案 1 :(得分:0)

我认为发生这种情况是因为javascript隐式地认为true的值为1false的值为0

当您执行-1 < x < 1时,您实际上正在做的是(-1 < x) < 1,如果true < 1x = 0,则实际上是false

但是,如果x=-2(-1 < x < -1)将返回true,因为false < 1true。希望这会有所帮助。

您可以在此处了解更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators

答案 2 :(得分:-1)

原因是JS解释了您的表情。

if((-1 < x) < 1) {
  console.log('x: ', x)
}

尝试使用括号...