Использование && short-circuiting в качестве оператора if?

Я видел эту строку в исходном коде jQuery.form.js:

g && $.event.trigger("ajaxComplete", [xhr, s]);

Моя первая мысль была wtf??

Моя следующая мысль была, я не могу решить, является ли это уродливым или изящным.

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

if (g) {
    $.event.trigger("ajaxComplete", [xhr, s]);
}

И во-вторых, эта распространенная/принятая практика в Javascript? С одной стороны, это кратким, но с другой стороны, это может быть немного загадочным, если вы его раньше не видели.

Ответ 1

Да, ваши два примера эквивалентны. Он работает примерно так на всех языках, но в Javascript он становится довольно идиоматичным. Лично я считаю, что это хорошо в некоторых ситуациях, но в других можно злоупотреблять. Это определенно короче, хотя, что может быть важно для минимизации времени загрузки Javascript.

Также см. Может ли кто-нибудь объяснить, как работает JavaScript JavaScript Джона Ресига?

Ответ 2

Он стандартный, но JSLint и JSHint нравится:

Ожидалось назначение или вызов функции и вместо этого увидело выражение.

Ответ 3

Вы должны быть осторожны, потому что это короткое замыкание можно обойти, если есть || в условном:

false && true || true
> true

Чтобы избежать этого, обязательно сгруппируйте условные выражения:

false && (true || true)
> false

Ответ 4

Да, вы понимаете это (в этом контексте); да, это стандартная практика в JavaScript.

Ответ 5

Да, это эквивалентно if, как вы писали. Это, конечно, не необычная практика. Принимает ли оно, зависит от того, кто (или нет) делает прием...

Ответ 6

По умолчанию это вызовет предупреждение jshint:

[jshint] Ожидал присваивания или вызова функции и вместо этого увидел выражение. (W030) [W030]

Однако лично я предпочитаю версию с коротким замыканием, она выглядит более декларативной и имеет "меньшую логику управления", хотя это может быть ошибочным представлением.