2013-03-11 2 views
13

Так, младший программист в моей команде сегодня написал следующий фрагмент кода:проверки значения переменной с помощью оператора OR

if(status === ("incomplete" || "unknown")) 

который, очевидно, не собирается делать то, что он намеревался, который был этим:

if(status === "incomplete" || status === "unknown")) 

Но я не могу объяснить, почему именно первый фрагмент кода не сработает! Или почему это будет истинным, если «статус» установлен в положение «неполной», но ложь, когда он установлен в «неизвестный» ...

ответ

20

В JavaScript, оператор || возвращает свой первый операнд, если он имеет значение true (т.е. это не false, null, undefined, "", или 0), и его второй операнд в противном случае.

В первом случае ("incomplete" || "unknown") всегда принимает значение "incomplete", так как оно равно true.

Все условие становится:

if (status === "incomplete") 

который объясняет поведение, которое вы наблюдаете.

+0

+1 - вы были 9 секунд быстрее с полностью сформированной ответ. Вау. – insertusernamehere

+2

«... возвращает свой первый операнд, если он оценивает значение« истина »...» Я бы изменил его, чтобы сказать: «возвращает свой первый операнд, если он правдивый», в скобках в основном объясняется это, но «правдивый» и «ложный» «это слова, наиболее часто используемые для выражения этой концепции. – zzzzBov

+0

Обычно я использую слова «правдивые» и «ложные», хотя я обнаружил, что они обычно путают новичков. Но да, это именно то, что я имею в виду. –

3

Но то, что я не могу объяснить, почему именно status === ("incomplete" || "unknown") не будет работать

Это потому, что выражение в скобках оценивается первым. Непустая строка incomplete является правдой, поэтому OR-expression("incomplete" || "unknown") дает "incomplete" и только затем сравнивается с вашей переменной status.

Чтобы сократить состояние, в том числе there are many ways массивов значений, регулярное испытание выражения и т.д.

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