2016-05-26 10 views
0

Может кто-нибудь объяснить мне, почему оба этих предупреждения «Истина»? Логический ИЛИ имеет смысл, я думаю - короткие замыкания ИЛИ после первого теста: 100! = 90, поэтому это правда. Почему происходит короткое замыкание И после первого теста и не продолжается?JS Logical And/Or

if (100 != 90 && 100 && 190 && 200 && 290){ 
    alert("true"); 
} else { 
    alert("false"); 
} 

if (100 != 90 || 100 || 190 || 200 || 290){ 
    alert("true"); 
} else { 
    alert("false"); 
} 

EDIT: СПАСИБО ВСЕМ ДЛЯ ВАШЕЙ ПОМОЩИ! Основе ваших предложений, я думаю, что я AMMEND мой код ЭТО:

var trains = [90,100,190,200,290]; 
var testValue = 100; 

if (trains.indexOf(testValue) >= 0){ 
    alert("true"); 
} 
+1

'если (! 100 = 90 && 100 && 190 && 200 && 290)' все это truthy. Что вы ожидали увидеть? –

+3

Я подозреваю, что ошибка, которую вы делаете, состоит в том, что вы думаете, что 'if (100! = 90 && 100)' эквивалентно 'if (100! = 90 && 100! = 100)', который он просто не –

+0

Точно, что я нужен Мэтт, спасибо – user3552105

ответ

1

Это оценит истина:

if (100 != 90 && 100 && 190 && 200 && 290) 

Поскольку каждая часть truthy. Любое ненулевое значение в javascript считается эквивалентным true. Таким образом, у вас есть:

if (true && true && true && true && true) 

Это, очевидно, правда. Это не короткое замыкание, потому что ни одно из значений не является ложным.

Я подозреваю, что ошибка, которую вы сделали, чтобы думать, что это:

if (100 != 90 && 100) 

делает то же самое, как это:

if (100 != 90 && 100 != 100) 

Что просто не так, как синтаксис работы. Легко сказать словами «если 100 не равно 90 и не равно 100» и понять, что это значит, но в javascript (и большинстве других языков) вы должны быть явным.

Теперь, очевидно, это становится очень утомительным, если у вас есть значение, которое нужно сравнить с длинным списком значений, например:

if (x != 90 && x != 100 && x != 190...) 

И в таком случае, как это, как правило, легче поставить все ваши значения в массив, а вместо этого спросить, если x содержится (или нет) в этом массиве:

var values = [90,100,190,...] 

if (!values.some(function(e) { return e === x; })) { 
    // the value x is not in the array values 
} 
+0

Спасибо за расширение ответа. Matt. Ты дал мне идею. Могу ли я добавить все значения в массив и сказать что-то вроде этого: (СМ. РЕДАКТИРОВАТЬ В НАЧАЛЬНОМ ВОПРОСЕ) – user3552105

0

Для & &, первый 100 = 90 оценивается как истина. Затем целые числа неявно преобразуются в bools, где 0 = false, true в противном случае. Истинные будут содержать номера, из которых ни один не равен 0.

Ваши комментарии о || верно.