2010-05-24 2 views
1

Как исправить этот синтаксис правильно:Javascript ||, как сравнить значение нескольких переменных?

if (tipoTropaPrioritaria[m] || troopsCount[m] || availableTroops[m]) == ("null" || "undefined") { 

... 

} 

(чтобы проверить, если любой из первых 3-х переменных является нулевым или не определено)

+7

Вы имеете в виду значения '' null' и undefined' или строковые значения ' "null" и "undefined" '? – Gumbo

+0

не строковые значения, значение «неактивное/неопределенное» в «внутреннем javascript». – FernandoSBS

+0

Не забудьте принять решение, когда вы будете удовлетворены. –

ответ

2

Использование:

if (tipoTropaPrioritaria[m] == null || troopsCount[m] == null || availableTroops[m] == null || 
    tipoTropaPrioritaria[m] == undefined || troopsCount[m] == undefined || availableTroops[m] == undefined) { 
    // ... 
} 

EDIT: Это, вероятно, лучше использовать в этом случае оператор === (threequals).

if (tipoTropaPrioritaria[m] === null || troopsCount[m] === null || availableTroops[m] === null || 
    tipoTropaPrioritaria[m] === undefined || troopsCount[m] === undefined || availableTroops[m] === undefined) { 
    // ... 
} 

или:

if (null in {tipoTropaPrioritaria[m]:0, troopsCount[m]:0, availableTroops[m]:0} || undefined in {tipoTropaPrioritaria[m]:0, troopsCount[m]:0, availableTroops[m]:0}) { 
+0

Вы должны использовать 'typeof foo ==" undefined "', поскольку undefined может быть задан как переменная с другим значением. –

+0

Что такое typeof foo и почему я должен его использовать? – FernandoSBS

+0

Я буду использовать, если (null в {tipoTropaPrioritaria [m]: 0, войскаCount [m]: 0, доступноTroops [m]: 0} || undefined in {tipoTropaPrioritaria [m]: 0, войскаCount [m]: 0, availableTroops [m]: 0}) Должен ли я использовать typeof foo ?? – FernandoSBS

1

Это самый лучший способ сделать то, что вы хотите

if (!tipoTropaPrioritaria[m] || !troopsCount[m] || !availableTroops[m]) { 
    ... 
} 

Оператор ! принуждают результат в логическое значение, которое может быть испытан (нуль и undefined становится ложным), а с ! спереди false сбрасывается на true.

Другой способ сделать это - проверить каждое выражение на null и undefined.

function isNullOrUndefined(val) { 
    return (val === null || typeof val == "undefined"); 
}  

if (isNullOrUndefined(a) || isNullOrUndefined(b) ...) { 

И вы знаете, правильный способ проверить неопределенными является

if (typeof foo === "undefined") {... 
+0

Я думаю, вы имеете в виду '==', а не '='. –

+0

Будьте осторожны с неспецифическим тестом. Непустое булевское значение ** false ** будет обрабатываться так же, как ** null **, если вы не проверите значение undefined/null. –

+0

Единственная проблема заключается в том, что 'availableTroops [m]' может быть законным 0, для чего может потребоваться другое поведение, чем null или undefined. – Gabe

0
if (tipoTropaPrioritaria[m] && troopsCount[m] && availableTroops[m]) { } 
else { /* At least ones is undefined/null OR FALSE */ } 

if (tipoTropaPrioritaria[m] == null || troopsCount[m] == null || availableTroops[m] == null) 
{ /* One is null. */ } 
+0

Что произойдет, если один из них - '0' в первом фрагменте кода? – Matt

+0

@Matt Вот что означал комментарий «ИЛИ ЛОЖЬ» (ноль, ложь, нуль) –

+0

Хорошая точка: P. Извинения – Matt

1

Способ сделать это:

if ((tipoTropaPrioritaria[m] == null || tipoTropaPrioritaria[m] == undefined) 
|| (troopsCount[m] == null || troopsCount[m] == undefined) || 
(availableTroops[m] == null || availableTroops[m] == undefined)) { 
... 
} 
3

Вы можете определить небольшой помощник функцию, которая выполняет проверку, а затем использует ее для всех значений:

function notset(v) { 
    return (v === undefined) || (v === null); 
} 

if (notset(tipoTropaPrioritaria[m]) || notset(troopsCount[m]) || 
    notset(availableTroops[m])) { 
    ... 
} 
+0

хорошо, но немного сложнее =) – FernandoSBS

+1

Просто из любопытства, будет ли любая из этих работ? http://pastebin.com/eA3L18qZ –

+1

@ Лукас: Я думаю, что они должны работать, но, вероятно, было бы более читаемым использовать именованную функцию вместо определения ее «inline». – sth

1

Если вы сделаете это много вы можете создать вспомогательную функцию

function isNullOrUndef(args) { 
    for (var i =0; i < arguments.length; i++) { 
     if (arguments[i] == null || typeof arguments[i] === "undefined") { 
      return true 
     } 
    } 
    return false 
} 

if (isNullOrUndef(tipoTropaPrioritaria[m], troopsCount[m], availableTroops[m])) 
    ... 
0

, если вы хотите проверить, если они равны нулю или неопределенными вы можете написать

if (!tipoTropaPrioritaria[m] || !troopsCount[m] || !availableTroops[m]) 

как нуль и undefinedfalsely значения. Тогда это будет справедливо только в том случае, если это не так. null или undefined. Пожалуйста, обратите внимание, что существуют и другие значения ложно, а также:

  • пустая строка
  • NaN
Смежные вопросы