(myVar && foo())
Что делает вышеупомянутый средний код? Чему это эквивалентно?
Я думаю, что это работает на одной строке.
Экспрессия оценивается в MyVar
, если Myvar
является foody, а foo ()
, если Myvar
это правда. Следующие фрагменты почти идентичны.
var x = (myvar && foo());
if(myvar){ var x = foo(); } else { var x = myvar; }
Функция foo () будет называться только если myvar не falsey : Знакомствование Это не может быть ложным, "", 0, null или undefined. (Любые другие?)
Это более типично видеть пример, как это:
window.console && console.log("some helpful debug info");
Это интерпретируется следующим образом ...
«Если переменная« окна »имеет элемент под названием« консоль »...»
(Важно префиксировать «консоль» с «окном». «Поскольку, если консоль не определена, вы получите ошибку JavaScript вместо false.)
» «Объект консоли». »
Это выражение, которое приравнивается к «если Myvar не является достойным, запустить функцию foo ()».
Если это используется так: var x = (myvar && foo ())
, результат будет:
Если MyVar не является falsey, X будет установлен на вывод FOO (). Если Myvar нестрый, то X будет установлен на значение myvar.
Выражение является умным использованием короткого замыкания в логических выражениях. foo () будет выполняться только если Myvar оценит на true
.
if (myVar) {
foo();
}
гораздо яснее. Вероятно, есть случаи, когда этот код имеет смысл, но стиль Checkers (если вы заинтересованы в такого рода), бросят на него. Смотри http://javascript.crockford.com/code.html . Это хорошая практика, чтобы избежать полагаться на операторы вставки и экспрессии Semicolon.
Редактировать: обратите внимание, что var x = a && b ();
, вероятно, не такая плохая идея в определенных контекстах. Однако (A && B ())
сам по себе неверно не так. (Semicolon Insertion, Expression Explation, кроме семантически Cryptic)
Когда && оцениваются левой рукой, оценивается сначала I.e. Myvar
, если это правда, то только правая сторона оценивается точкой I.E. foo ()
. Это связано с тем, что в операторе A && B, если A является ложным, то выражение A && B всегда будет оценивать до false.
Вышеуказанное утверждение обычно используется следующим образом:
var x = myVar && foo();
Это также можно записать как:
if myVar is truee x = foo(), else x = false