2013-02-19 4 views
4

Я заинтересован в практическом применении декларирование переменных с использованием && так:Использование логических и в Javascript Объявления переменных

var x = undefined && 4; 

// Evaluate to the first falsey value 
// or else the last value. 

eval(x); 
// undefined 

Я понимаю, как оценивается значение (см this SO answer). Я также понимаю, его сестра || (см here для большого описания), и почему это было бы полезно, чтобы объявить переменную следующим выражением:

// Some other variable 
var y; 

var x = y || 4; 

// Evaluate to the first truthy value 
// or else the last value. 

Практически: Используйте первое значение, если что первое значение не falsey; если это так, используйте последнее значение. Мы можем продемонстрировать эту особенность || в консоли браузера:

> null || 4 
    4 
> 4 || null 
    4 

> null || undefined 
    undefined 
> undefined || null 
    null 

> true || 4 
    true 
> 4 || true 
    4 

Как для &&:

> null && 4 
    null 
> 4 && null 
    null 

> null && undefined 
    null 
> undefined && null 
    undefined 

> true && 4 
    4 
> 4 && true 
    true 

Должны ли мы принять это означает: использовать первое значение, если что первое значение не truthy; если да, используйте последнее значение?

Я заинтересован в использовании ярлыков для кодирования, чтобы свести к минимуму использование условных операторов, и я задаюсь вопросом, могу ли я как-нибудь использовать это.

Я нашел пример этого метода кодирования в line 472 источника основного JQuery:

scripts = !keepScripts && []; 

Таким образом, вопрос заключается в следующем: Может ли кто-нибудь описать хороший контекст для использования && в яваскрипта объявлении переменной? Считаете ли вы, что это плохая практика?

Спасибо!

+1

Я лично рекомендовал бы против этого: это действительно не очень читаемо. Не зная об этом поведении, я ожидал бы что-то вроде '! KeepScripts && []' для оценки «false», что может привести к некоторым трудностям для отслеживания ошибок. – ChrisC

+0

Я бы написал нормальные условные утверждения, а затем использовал предварительные мини-инструменты, такие как [Google Closure Compiler] (https://developers.google.com/closure/compiler/), чтобы минимизировать код. –

ответ

3

В общем, вы должны использовать только «ярлыки», подобные этому, если код больше, который можно прочитать для обычного программиста JavaScript, чем альтернатива.

Когда вы думаете о том, что более читаемым и менее удивительно, считают, что

var foo; 
if(bar) { 
    foo=[]; 
} 

и

var foo = bar && []; 

не то же самое. Например, если bar - NaN, тогда foo будет тогда NaN в более позднем случае, который позже может быть немного головным скребком.

Поскольку есть инструменты для оптимизации/минимизации JavaScript, вам следует сосредоточиться на читабельности вашего кода, что не всегда одно и то же, что и краткость.

Допустим, у вас есть несколько таких повторяющихся инициализаций в строке, все они зависят от разных переменных (так что они не могут быть обернуты в один условный), но следуют той же логической формуле. В этом случае, когда читатель мысленно проанализировал значение формулы, они могли бы быстро просмотреть все экземпляры и увидеть различия между ними. В этом случае вместо того, чтобы полагаться на соглашение, с которым знакомы большинство программистов JavaScript (например, var foo = some_opt || {}), вы создаете локализованное соглашение, которое читателю нужно будет изучить только для этого файла. Даже в этом случае я бы посоветовал тщательно подумать, возможно, не стоит.

0

На самом деле, вы не должны регулярно использовать & & Оператор, такой как JQuery, так как это всегда опасный код. Вы можете забыть, что вы сделали, или вы не можете найти ошибку из-за этого использования. Я лично считаю это плохой практикой. Вы можете предпочесть использовать, но код становится нечитаемым. Мы, разработчики, должны думать о понятности и читаемости кода.

0

Ну, это распространенная идиома, но, возможно, это делает ваш код менее читаемым. Итак, мое предложение, держите его простым, даже если это означает еще несколько нажатий клавиш.

1

Я нашел одно конкретное обстоятельство, в котором может быть полезно использовать && в процессе отладки.

Предположим, у нас есть переменная x. Иногда x имеет значение null, а иногда x - объект со значением {'foo':'bar'}. Мы хотим написать выражение, которое возвращает значение x.foo, если оно существует.

Однако мы должны быть осторожны. Вызов свойства объекта, который не существует, может привести к следующим образом:

> Uncaught TypeError: Cannot read property 'foo' of null 

Таким образом, мы можем записать так:

x && x.foo 

Что делает следующее:

  1. Если x является Объект и x.foo существует, дайте нам значение x.foo.

  2. Если x - Объект и x.foo не существует, возврат undefined.

  3. If x is null, return null.

Пока x уже упоминалось где-то (даже если x просто установлено нулевое значение или не определено), то выражение не должно нарушать код.

Смежные вопросы