代码之家  ›  专栏  ›  技术社区  ›  punkrockbuddyholly

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

  •  339
  • punkrockbuddyholly  · 技术社区  · 14 年前

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

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

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

    但这并不是:

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

    这个怪癖有用吗?

    13 回复  |  直到 9 年前
        1
  •  437
  •   Alan Geleynse buhbang    14 年前

    操作顺序原因 (0 < 5 < 3) 在javascript中解释为 ((0 < 5) < 3) (true < 3) 而true被计算为1,导致它返回true。

    这也是为什么 (0 < 5 < 1) (0 < 5) 返回true,解释为 1 (1 < 1) .

        2
  •  63
  •   CaffGeek    14 年前

    我猜是因为 0 < 5 是真的,而且 true < 3 1 < 3 这是真的。

        3
  •  21
  •   Jack    14 年前

    可能是因为 true 假设为 1

    0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true
    
        4
  •  17
  •   Harmen    14 年前

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

        5
  •  10
  •   Zach Johnson    14 年前

    这有点像在更大的表达式中使用post/pre increment/decrement。你能一眼看出这段代码的结果吗?

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

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

    这是个好主意 谁来读你的密码。清楚地写下你真正想要发生的事情,而不是依赖于副作用,比如布尔人的隐性转化。

        6
  •  9
  •   Community CDub    8 年前

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

    数组语言APL中的一个典型例子是计算数组中(比如)大于100的项的数量:

    +/A>100
    

    A>100
    

    生成5项布尔数组:

    1 0 1 1 0

    并求这个布尔结果的和:

    +/1 0 1 1 0
    

    This question 这是一个很好的例子,说明了这项技术非常有用,特别是当问题被推广到确定m个布尔值中的n个值是否为真时。

    Check if at least two out of three booleans are true

        7
  •  7
  •   netrox    14 年前

    那很容易。

    (0 < 5 < 3)
    

    从左到右开始计算第一个0<5。是真的吗?对。因为TRUE=1,所以它的值为1<3。因为1小于3所以这是真的。

    现在有了这个

     (0 < 5 < 1)
    

        8
  •  4
  •   David    14 年前

    当1<3为true时,是否计算0<5哪个值将返回1作为true?

        9
  •  4
  •   Hippocrates    14 年前

    不久前我在Obj-C遇到了这个问题,对此我很困惑。我通过这样做得到了我想要的结果:

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

    这当然是假的,所以你不会得到“真”的警告。 很高兴我读到这个,我现在知道为什么了。

        10
  •  4
  •   Hippocrates    12 年前

    除了python之外,CoffeeScript是另一种支持链式比较的语言,因此 3 < x < 10 (3 < x && x < 10) 香草味JS

        11
  •  3
  •   Michał Perłakowski    9 年前
    0 < 5 < 3 
    ==> ( ( 0 < 5 ) < 3 )
    ==> true < 3
    ==> 1 < 3
    ==> true
    
        12
  •  1
  •   Rajkamal Subramanian    13 年前

    在数学运算符上操作时,布尔操作数返回一个数字。

    true + 1  which gives you 2.
    

    所以 0 < 5 ,使用数学运算符(<)操作返回的布尔值(true)将返回一个数字。所以它可以归结为1<3,它返回 true

        13
  •  1
  •   ndotie    6 年前

    因为0小于5,则返回true;默认情况下,true是包含的任何内容,并且可以计算为1,1仍然小于3,则再次返回true

        14
  •  0
  •   SwiftNinjaPro    5 年前

    试着用数字()

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

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

    我搜索这个是因为我得到了 (3 >= 20) //returning true 我猜javascript试图检查 3 作为布尔值,因为我从 elm.getAttribute(); 功能 console.log();