Что означает (myVar & & foo ()) в JavaScript?
(myVar && foo())
что означает приведенный выше код? Что это эквивалентно?
Я думаю, что он работает на одной линии.
5 ответов
выражение myvar
если myvar
это falsey, и foo()
Если myvar
- истина. Следующие фрагменты почти идентичны.
var x = (myvar && foo());
if(myvar){ var x = foo(); } else { var x = myvar; }
это выражение, которое приравнивается к "если myVar не является falsey, запустите функцию foo ()".
Если он используется следующим образом:var x = (myVar && foo())
результат будет:
если myVar не является falsey, x будет установлен на выход foo (). если myVar является falsey, то x будет установлено значение myVar.
функция foo () будет вызываться, только если myVar не falsey: значение не может быть false,"", 0, null или undefined. (Другие?)
более типично видеть такой пример:
window.console && console.log("some helpful debug info");
это интерпретируется следующим образом...
"если переменная' window ' имеет член под названием 'console'..."
(важно префикс 'console' с 'window.'потому что, если консоль не определена, вы получите ошибку JavaScript вместо false.)
"... вызовите метод log в объекте console."
выражение делает умное использование короткого замыкания в булевых выражениях. foo () будет выполняться, только если myVar оценивает значение true
.
if (myVar) {
foo();
}
гораздо понятнее. Вероятно, есть случаи, когда такой код имеет смысл, но шашки стиля (Если вас интересуют такие вещи) будут бросать на него удар. См.http://javascript.crockford.com/code.html. Рекомендуется избегать использования вставки и выражения с запятой заявления.
edit: обратите внимание, что var x = a && b();
вероятно, не такая уж плохая идея в определенных контекстах. Однако,(a && b())
сам по себе является неправильным в нескольких отношениях. (вставка точки с запятой, оператор выражения, помимо семантически загадочного)
когда & & оцениваются левая рука оценивается сначала т. е. myVar
, если это правда, то оценивается только правая сторона, т. е. foo()
. Это связано с тем, что в операторе A && B если a false, то выражение A&B всегда будет оцениваться как false.
приведенное выше утверждение обычно используется следующим образом:
var x = myVar && foo();
это также может быть записана так:
if myVar is truee x = foo(), else x = false