2013-05-20 122 views
2

我想檢查變量y是否小於x並大於z,但是由於某種原因,此布爾表達式返回false。 JavaScript是否允許布爾表達式如此簡潔地書寫?如果是這樣,那麼正確的語法是什麼?在JavaScript布爾表達式中的多個比較運算符

x = 2; 
y = 3; 
z = 4; 

if(x > y > z){ 
    alert("x > y > z"); //Nothing happens! 
} 

回答

5

嘗試使用邏輯操作:

if (x > y && y > z) { 

,以保證兩個條件都爲真。

DEMO:http://jsfiddle.net/3sxvy/

如果你需要把這個變成一個功能,你可以嘗試:

function compareNumbers(direction) { 
    var inOrder = (function() { 
     if (direction === "desc") { 
      return function (current, before) { 
       return current <= before; 
      }; 
     } else if (direction === "asc") { 
      return function (current, before) { 
       return current >= before; 
      }; 
     } 
    })(); 
    var valid = true; 
    for (var i = 2; i < arguments.length; i++) { 
     if (!inOrder(arguments[i], arguments[i-1])) { 
      valid = false; 
      break; 
     } 
    } 
    return valid; 
} 

if (compareNumbers("desc", 33, 5)) { 
    console.log("Good"); 
} else { 
    console.log("Bad"); 
} 

DEMO:http://jsfiddle.net/kn6M4/1/

+0

它會更好,如果我可以創建實際上能夠解析「簡潔」的布爾表達式類似上面的功能。 –

+1

問題是,你的「簡潔」表達式在JavaScript中有意義,但是不同(見我的答案)。 –

+0

@AndersonGreen我不知道它是否有幫助,但我添加了一個函數,它可以與比較結果(按升序或降序)進行相同的操作,並且可以將多個數字傳遞給該函數。它確實只能用於相同的升序/降序的數字。 – Ian

1

更改您的測試

if (x > y && y > z){ 

當你寫(x > y > z),這相當於((x>y)>z),所以你比較布爾(x>y)z。在此測試中,true轉換爲1,該值不大於2

3

你想

if(x > y && y > z){ 
    alert("x > y > z"); //Nothing happens! 
} 

的Javascript會嘗試解析你原來的語句從左至右,到頭來你會比較Z到隨後將被解析爲數字的一個布爾值(0或1) 。

所以原來的語句相當於

if((x > y && 1 > z) || (x <= y && 0 > z)) 
+0

不幸的是,這並不像原文那樣簡潔。我希望JavaScript實際上允許這種簡潔的布爾表達式語法。 –

+1

是的,但它有*工作*的輕微好處!我相信原來的評價從左到右,這意味着一旦評估了第一部分,下一個評估就是'if(true> z){'這是沒有意義的。同樣的機制可以讓你的例子更加簡潔,不會允許'var x = y ||之類的東西z || g;'這比語法糖更有利。 – Ocelot20

+0

@ Ocelot20這是正確的,但JS實際上將它轉換爲一個數字進行轉換,所以它真的等同於我更新的答案中的語句。哪種有意義,但顯然不是OP的意圖。 –