2012-02-03 2 views
14

Я думаю, что мне не хватает чего-то основного здесь. Почему третье условие IF истинно? Не должно ли условие оцениваться как ложное? Я хочу сделать что-то, где идентификатор не 1, 2 или 3.javascript несколько OR условий в заявлении IF

var id = 1; 
if(id == 1) //true  
if(id != 1) //false 
if(id != 1 || id != 2 || id != 3) //this returns true. why? 

Спасибо.

+5

потому что 'id' не равно' 2' или '3'? 'false || true || true == true' –

+3

1! = 2 .. это, очевидно, верно .. lollzzz –

+1

потому что id> 3, imo. – ddacot

ответ

28

С операцией OR (||), если выполнено одно из условий, результат верен.

Я думаю, вы хотите AND (& &) работа здесь.

+1

Спасибо. Теперь я чувствую себя глупо, задавая этот вопрос :(Я смутился. – tempid

+14

Ха. Мы все были там, поверьте мне. – Gabe

1

потому что оператор OR вернет true, если какое-либо из условий истинно, а в вашем коде есть два условия, которые являются истинными.

3

Каждый из этих трех условий оценивается независимо друг от друга [1]:

id != 1 // false 
id != 2 // true 
id != 3 // true 

Затем он оценивает false || true || true, что верно (a || b верно, если либо a или b верно). Я думаю, что вы хотите

id != 1 && id != 2 && id != 3 

, который является единственно верным, если ID не 1 И это не 2 И это не 3.

[1]: Это не совсем верно, посмотрите short-circuit evaluation. В действительности оцениваются только первые два предложения, потому что это все, что необходимо для определения истинного значения выражения.

1

Когда он проверяет идентификатор! = 2 она возвращает истину, и останавливает дальнейшую проверку

+1

Это также важно отметить; он пригодится, если вам нужно проверить, существует ли объект перед проверкой параметра. 'if (obj! = null && obj.field == 2)' –

+0

-1 - Интересная боковая точка, но не проблема с корнем. – user66001

16

Вы хотите выполнить код, в котором идентификатор не является (1 или 2 или 3), но оператор ИЛИ не распространяете над идентификатором. Единственный способ сказать, что вы хотите сказать

идентификатор не 1, а идентификатор не 2, а идентификатор не 3.

, который переводит

if (id !== 1 && id !== 2 && id !== 3) 

или же что-то более pythonesque:

if (!(id in [,1,2,3])) 
+7

+1 для нижней конструкции. – user66001

+0

Альтернативные проверки индекса. Нет, если значение находится в массиве. В отличие от python, где он проверяет значение. 'array.indexOf (id) == -1' означает, что идентификатор отсутствует в массиве. используйте '! =' для противоположного. – Neil

+0

@NeilDesh, обратите внимание на ',' в начале. Они эквивалентны –

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