为什么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个末端。这些表达式如何计算?
答案 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 = -1
和x = 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
的值为1
和false
的值为0
。
当您执行-1 < x < 1
时,您实际上正在做的是(-1 < x) < 1
,如果true < 1
是x = 0
,则实际上是false
。
但是,如果x=-2
,(-1 < x < -1)
将返回true
,因为false < 1
是true
。希望这会有所帮助。
您可以在此处了解更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators
答案 2 :(得分:-1)
原因是JS解释了您的表情。
if((-1 < x) < 1) {
console.log('x: ', x)
}
尝试使用括号...