(myVar && foo())
Что означает вышеуказанный код? Что это эквивалентно?Что означает (myVar && foo()) в JavaScript?
Я думаю, что он работает на одной линии.
(myVar && foo())
Что означает вышеуказанный код? Что это эквивалентно?Что означает (myVar && foo()) в JavaScript?
Я думаю, что он работает на одной линии.
Выражение вычисляется в myvar
, если myvar
является falsey и foo()
, если это myvar
truthy. Следующие фрагменты почти идентичны. Функция
var x = (myvar && foo());
if(myvar){ var x = foo(); } else { var x = myvar; }
это выражение, которое приравнивается к «если myVar не является ложным, запустите функцию foo()». Если он используется следующим образом: var x = (myVar && foo())
, результатом будет:
Если myVar не является ложным, x будет установлен на выход foo(). если myVar является ложным, тогда x будет установлено значение myVar.
Выражение делает умное использование короткого замыкания в булевых выражениях. foo() будет выполняться только в том случае, если myVar оценивает значение true
.
if (myVar) {
foo();
}
намного яснее. Вероятно, есть случаи, когда такой код имеет смысл, но шашки стиля (если вас интересует такая вещь) будут бросать на него посадку. См. http://javascript.crockford.com/code.html. Это хорошая практика, чтобы не полагаться на выражения для ввода и выражения с запятой.
Редактировать: Обратите внимание, что var x = a && b();
, вероятно, не такая плохая идея в определенных контекстах. Однако, (a && b())
сам по себе является неправильным несколькими способами. (Вставка точкой с запятой, выражение заявление, в стороне от семантически зашифрованное)
Я видел это на скрипте jquery (диалог ui) ... – Val
«Использование» «глупый» - это некоторые сильные слова :) Если вы много используете JS, это имеет смысл и ясен, когда он стоит. –
Существуют, конечно, обстоятельства, при которых такой код не является глупым по какой-либо разумной мере. Например, в контексте 'if (enabled && isVisible()) ... или какой-то такой ситуации. – Grumdrig
Foo() будет вызываться только если MYVAR не falsey: это означает, что не может быть ложным, "", 0, NULL, или не определено. (Любые другие?)
Это более типично, чтобы увидеть пример, как это:
window.console && console.log("some helpful debug info");
Это интерпретируется следующим образом ...
«Если переменная„окна“имеет элемент, называемый ' консоль»...„
(это важно префикс „консоль“ с „окном“. потому что, если консоль не определен, вы получите ошибку JavaScript вместо ложной.)
“... в voke метод «log» на объекте «console».
* «Любые другие?» * Просто -0 и NaN, я думаю. –
@Jason: '0',' NaN', строка с нулевой длиной, 'undefined',' null' и, конечно, 'false' являются * falsy * ... – CMS
А, подумал о NaN, когда писал, но забыл набрать его. Благодаря! –
, когда & & оценивается левая рука сначала вычисляется т.е. myVar
, если это так, то только правая часть оценивается т.е. foo()
. Это связано с тем, что в заявлении A & & B, если A является ложным, тогда выражение A & & B всегда будет оценивать значение false.
Данное заявление обычно используется следующим образом:
var x = myVar && foo();
это также можно записать в виде:
if myVar is truee x = foo(), else x = false
Если MyVar является truthy й не установлен истинным, его набор на значение foo(), что бы это ни было. – brad
Это не совсем верно. Если myVar равно 0, то x устанавливается в 0, а не false. –
Вы оба правы. Ответ исправлен. – glomad