2013-05-20 2 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 попытается разобрать ваш оригинал выписки слева направо, и вы будете в конечном итоге сравнения г в логическое значение, которое будет затем анализироваться на число (0 или 1) ,

Так что ваше первоначальное заявление эквивалентно

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

Это не так лаконично, как оригинал, к сожалению. Я надеялся, что JavaScript действительно разрешит такой синтаксис булевых выражений. –

+1

Да, но это имеет небольшое преимущество * working *! Оригинал оценивается слева направо. Я полагаю, что, как только первая оценка была оценена, следующей оценкой будет 'if (true> z) {', что не имеет смысла. Тот же механизм, который позволил бы вашему примеру быть более кратким, не позволял бы такие вещи, как 'var x = y || z || g; ", что является большим преимуществом, чем синтаксический сахар. – Ocelot20

+0

@ Ocelot20 thats correct, но JS на самом деле отбросит его на число для преобразования, поэтому его действительно эквивалентно утверждению в моем обновленном ответе. Какой смысл имеет смысл, но явно не то, что предполагал ОП. –

Смежные вопросы