2013-05-20 82 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的意图。 –