2015-03-17 3 views
0

Недавно я наткнулся на следующий синтаксис ошибки:Почему моя неправильная инструкция if работает?

if (button=="init" || "show_selected" || "show_all") { 

Конечно, это должно было быть:

if (button=="init" || button=="show_selected" || button=="show_all") { 

ОДНАКО, первоначальное заявление, казалось, отлично работает в Chrome, FF и IE9 !? !? Я только оценил свою ошибку, добавив новый вариант.

Чтобы уточнить, «init», «show_selected» и «show_all» являются строковыми аргументами, используемыми при вызове функции; например

onclick=myFunction("init"); 

Я уверен, что я помню, пытаясь этим видом стенографии на ранней стадии, когда обучение JS и выяснить, очень быстро, что не работы.

В любом случае, я уже исправил код, но меня раздражает, что я не понимаю, почему он работает.

Может ли кто-нибудь пролить свет на эту загадку?

+0

Ну, это не сработало «отлично», потому что логика неверна, но это, конечно, не ошибка синтаксиса. – JJJ

+0

|| "show_selected" всегда будет true –

+0

'" show_all "' принудительно до логического значения 'true' – hindmost

ответ

1

Конечно, это будет работать, и он всегда будет работать, потому что ваше состояние будет всегда true:

if (button=="init" || "show_selected" || "show_all") 

Will всегда давать true, потому что "show_selected" - это строка, и если вы передадите ее как условие if, это будет всегда верно, ваш код будет оцениваться следующим образом:

if (button=="init" || true || true) // Will always be true 

Поскольку написание if ("show_all") эквивалентно if ("show_all" !== null), который является true.

Например, попробуйте следующее:

if ("show_all"){ //returns true (the statement is true) 
 
    alert(true); 
 
}

+0

' "show_selected" 'это строка, а не объект. – JJJ

+0

@ Юхана: Хорошо указав, я отредактировал свой ответ. –

+0

Спасибо, это имеет прекрасный смысл. Я включил оператор if, предположив, что в конечном итоге я добавлю опции, которые не будут использовать эту часть функции. Как оказалось, все варианты, до сих пор, используют этот код, поэтому я не заметил проблемы. – Thailandian

0

Ваши строки являются выражениями, которые являются истинными значениями.

if ("show_selected") { /* ... */ } 

... будет запускать код в блоке.

Вы используете строки в RHS каждого из ваших инструкций OR, поэтому RHS каждого из них истинно.


Дано:

myFunction("init"); 

Тогда:

button=="init" 

Is:

true 

Итак:

button=="init" || "show_selected" 
true || "show_selected" 
true 

Если вы должны были пройти в любом другом значении

button=="init" || "show_selected" 
false || "show_selected" 
"show_selected"