我想檢查變量y是否小於x並大於z,但是由於某種原因,此布爾表達式返回false。 JavaScript是否允許布爾表達式如此簡潔地書寫?如果是這樣,那麼正確的語法是什麼?在JavaScript布爾表達式中的多個比較運算符
x = 2;
y = 3;
z = 4;
if(x > y > z){
alert("x > y > z"); //Nothing happens!
}
我想檢查變量y是否小於x並大於z,但是由於某種原因,此布爾表達式返回false。 JavaScript是否允許布爾表達式如此簡潔地書寫?如果是這樣,那麼正確的語法是什麼?在JavaScript布爾表達式中的多個比較運算符
x = 2;
y = 3;
z = 4;
if(x > y > z){
alert("x > y > z"); //Nothing happens!
}
嘗試使用邏輯和操作:
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");
}
更改您的測試
if (x > y && y > z){
當你寫(x > y > z)
,這相當於((x>y)>z)
,所以你比較布爾(x>y)
到z
。在此測試中,true
轉換爲1
,該值不大於2
。
你想
if(x > y && y > z){
alert("x > y > z"); //Nothing happens!
}
的Javascript會嘗試解析你原來的語句從左至右,到頭來你會比較Z到隨後將被解析爲數字的一個布爾值(0或1) 。
所以原來的語句相當於
if((x > y && 1 > z) || (x <= y && 0 > z))
不幸的是,這並不像原文那樣簡潔。我希望JavaScript實際上允許這種簡潔的布爾表達式語法。 –
是的,但它有*工作*的輕微好處!我相信原來的評價從左到右,這意味着一旦評估了第一部分,下一個評估就是'if(true> z){'這是沒有意義的。同樣的機制可以讓你的例子更加簡潔,不會允許'var x = y ||之類的東西z || g;'這比語法糖更有利。 – Ocelot20
@ Ocelot20這是正確的,但JS實際上將它轉換爲一個數字進行轉換,所以它真的等同於我更新的答案中的語句。哪種有意義,但顯然不是OP的意圖。 –
它會更好,如果我可以創建實際上能夠解析「簡潔」的布爾表達式類似上面的功能。 –
問題是,你的「簡潔」表達式在JavaScript中有意義,但是不同(見我的答案)。 –
@AndersonGreen我不知道它是否有幫助,但我添加了一個函數,它可以與比較結果(按升序或降序)進行相同的操作,並且可以將多個數字傳遞給該函數。它確實只能用於相同的升序/降序的數字。 – Ian