我想检查变量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