Использование && 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]
Однако лично я предпочитаю версию с коротким замыканием, она выглядит более декларативной и имеет "меньшую логику управления", хотя это может быть ошибочным представлением.