Что означает (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