Короткое вычисление

Оригинальное название: short-circuit evaluation

Коротко

Правило, по которому логическое выражение перестаёт вычисляться, как только результат ясен: у «И» — на первом ложном операнде, у «ИЛИ» — на первом истинном.

Что такое «Короткое вычисление»

Если в выражении a && b операнд a ложен, итог уже известен: «ложь», что бы ни было в b. Поэтому b не вычисляется вовсе — функция не вызывается, свойство не читается. С || зеркально: первый истинный операнд решает всё. Так устроены логические операторы в большинстве языков, включая JavaScript и PHP.

Экономия на вычислениях тут вторична. Главное — порядок проверок становится гарантией: сначала убеждаемся, что объект существует, и только потом обращаемся к нему.

Приёмы в JavaScript

// защита от обращения к несуществующему объекту
const city = user && user.address && user.address.city;
// то же короче, с опциональной цепочкой
const city2 = user?.address?.city;

// значение по умолчанию
const perPage = settings.perPage ?? 24;
// вызов функции только при выполнении условия
isDebug && console.log('корзина', cart);

В JavaScript && и || возвращают не булево значение, а сам операнд, на котором остановились. Именно это позволяет писать значения по умолчанию.

Ловушка с нулём

Оператор || считает ложными 0, пустую строку, false, NaN, null и undefined. Запись qty || 1 превратит осознанно выбранный ноль в единицу, а пустой комментарий к заказу — в значение по умолчанию. Оператор ?? срабатывает только на null и undefined, поэтому для настроек и чисел безопаснее он. Подробнее об отсутствии значения — в статье про null. Есть и сокращённые присваивания: a ??= b записывает b, только если a пусто.

Особенности PHP

$limit = $_GET['limit'] ?? 20;
if (isset($order) && $order->isPaid()) { /* … */ }

$ok = true and false;   // $ok === true!

В PHP && и || всегда возвращают true или false, а для значений по умолчанию служат ?? и сокращённый тернарный оператор ?:. Последняя строка примера — известный подвох: у словесных and и or приоритет ниже, чем у присваивания, поэтому сначала выполняется $ok = true, а уже потом and. В условиях лучше использовать символьные операторы.

Злоупотреблять коротким вычислением для побочных эффектов не стоит: строка valid && save() || showError() читается хуже обычного if и ведёт себя неожиданно, если save() вернёт ложное значение.

Обновлено:

Все термины раздела «Frontend»

Что будем искать? Например,Продвижение