javascript - string比较 - mdn




为什么(0<5<3)返回true? (8)

我在jsfiddle.net上玩耍,我很好奇为什么这会返回true?

if(0 < 5 < 3) {
    alert("True");
}

那么这样做:

if(0 < 5 < 2) {
    alert("True");
}

但是这并不是:

if(0 < 5 < 1) {
    alert("True");
}

这个古怪有用吗?


可能是因为假设为1

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true

因为true < 3 ,因为true == 1


我的猜测是因为0 < 5是真的,而true < 3被转换为1 < 3这是真的。


操作顺序导致(0 < 5 < 3)在javascript中被解释为((0 < 5) < 3) ,其产生(true < 3)并且true被计为1,导致其返回true。

这也是为什么(0 < 5 < 1)返回false, (0 < 5)返回true,将其解释为1 ,导致(1 < 1)


至于你的问题,这个怪癖是否有用:我想可能有些情况下它会有用(如果精简的代码就是你以后的代码),但依赖它会(很可能)严重降低代码的可理解性。

这有点像使用post / pre increment / decrement作为更大表达式的一部分。 你能确定一下这段代码的结果吗?

int x = 5;
int result = ++x + x++ + --x;

注意:使用此代码,有时甚至可能根据语言和编译器得到不同的结果。

让自己和下一个会阅读你的代码的人生活变得很容易是个不错的主意。 清楚地写出你真正想要发生的事情,而不是像布尔的隐式转换那样依赖副作用。


这很容易。

(0 < 5 < 3)

从左到右开始,以评估第一个0 <5。是真的吗? 是。 由于TRUE = 1,它评估1 <3。因为1小于3所以它是真的。

现在这个

 (0 < 5 < 1)

是否小于5? 是。 因此,使它成为TRUE,这也意味着1.现在考虑到这一事实,它评估为(1 <1)。 1小于1? 不,所以这是错误的。 它必须是平等的。


问题第二部分的答案是“这个古怪有用吗?” 正如前面的回答所指出的,如果它确实是语言(Javascript)的一个怪癖,那么真正的投票就是1,但程序员的总体观点1和真实(以及0和假)都不是一样。

但是,如果你有一个1为真的心智模型,0为假,那么它会导致各种非常有用,强大和直接的好布尔技术。 例如,你可以用A> 100的结果直接递增一个计数器,如果A大于100,这将增加计数器。这种技术可能被看作是Java中的一个怪癖或技巧,但是在数组或函数式语言中可能是惯用的。

数组语言APL中的一个经典示例是计算数组中(例如)大于100的项数:

+/A>100

如果A是5项目阵列107 22 256 110 3,那么:

A>100

产生5个项目的布尔数组:

1 0 1 1 0

并总结这个布尔结果:

+/1 0 1 1 0

得出最终答案:

3

这个问题是一个很好的例子,说明这种技术会非常有用,特别是如果问题被推广到确定m个布尔值中的n是否为真。

检查三个布尔中至少有两个是否为真


除python之外,CoffeeScript是另一种支持链式比较的语言,因此3 < x < 10将被转换为(3 < x && x < 10)在vanilla JS中







boolean-logic