2010-01-11 2 views

ответ

8

Выражение вычисляется в myvar, если myvar является falsey и foo(), если это myvar truthy. Следующие фрагменты почти идентичны. Функция

var x = (myvar && foo()); 

if(myvar){ var x = foo(); } else { var x = myvar; } 
4

это выражение, которое приравнивается к «если myVar не является ложным, запустите функцию foo()». Если он используется следующим образом: var x = (myVar && foo()), результатом будет:

Если myVar не является ложным, x будет установлен на выход foo(). если myVar является ложным, тогда x будет установлено значение myVar.

+0

Если MyVar является truthy й не установлен истинным, его набор на значение foo(), что бы это ни было. – brad

+0

Это не совсем верно. Если myVar равно 0, то x устанавливается в 0, а не false. –

+0

Вы оба правы. Ответ исправлен. – glomad

1

Выражение делает умное использование короткого замыкания в булевых выражениях. foo() будет выполняться только в том случае, если myVar оценивает значение true.

if (myVar) { 
    foo(); 
} 

намного яснее. Вероятно, есть случаи, когда такой код имеет смысл, но шашки стиля (если вас интересует такая вещь) будут бросать на него посадку. См. http://javascript.crockford.com/code.html. Это хорошая практика, чтобы не полагаться на выражения для ввода и выражения с запятой.

Редактировать: Обратите внимание, что var x = a && b();, вероятно, не такая плохая идея в определенных контекстах. Однако, (a && b()) сам по себе является неправильным несколькими способами. (Вставка точкой с запятой, выражение заявление, в стороне от семантически зашифрованное)

+2

Я видел это на скрипте jquery (диалог ui) ... – Val

+2

«Использование» «глупый» - это некоторые сильные слова :) Если вы много используете JS, это имеет смысл и ясен, когда он стоит. –

+3

Существуют, конечно, обстоятельства, при которых такой код не является глупым по какой-либо разумной мере. Например, в контексте 'if (enabled && isVisible()) ... или какой-то такой ситуации. – Grumdrig

3

Foo() будет вызываться только если MYVAR не falsey: это означает, что не может быть ложным, "", 0, NULL, или не определено. (Любые другие?)

Это более типично, чтобы увидеть пример, как это:

window.console && console.log("some helpful debug info"); 

Это интерпретируется следующим образом ...

«Если переменная„окна“имеет элемент, называемый ' консоль»...„

(это важно префикс „консоль“ с „окном“. потому что, если консоль не определен, вы получите ошибку JavaScript вместо ложной.)

“... в voke метод «log» на объекте «console».

+1

* «Любые другие?» * Просто -0 и NaN, я думаю. –

+1

@Jason: '0',' NaN', строка с нулевой длиной, 'undefined',' null' и, конечно, 'false' являются * falsy * ... – CMS

+0

А, подумал о NaN, когда писал, но забыл набрать его. Благодаря! –

0

, когда & & оценивается левая рука сначала вычисляется т.е. myVar, если это так, то только правая часть оценивается т.е. foo(). Это связано с тем, что в заявлении A & & B, если A является ложным, тогда выражение A & & B всегда будет оценивать значение false.

Данное заявление обычно используется следующим образом:

var x = myVar && foo(); 

это также можно записать в виде:

if myVar is truee x = foo(), else x = false 
Смежные вопросы