awilum.ru
Статьи Курсы Об авторе

Оценка короткого замыкания в JavaScript

Оценка короткого замыкания, минимальная оценка или Оценка Джона Маккарти (short-circuit evaluation) — семантика некоторых логических операторов в языках программирования, в которых второй аргумент выполняется или оценивается, только если первый аргумент выполняет не достаточно для определения значения выражения: когда первый аргумент функции AND принимает значение false, общее значение должно быть false и когда первый аргумент функции OR оценивается как true, общее значение должно быть true.

В JavaScript — эта особенность логических операторов, позволяет быстро определить результат булевого выражения.

В JavaScript, операторы && и || используют оценку короткого замыкания.

Оценка короткого замыкания оператора &&

Оператор && возвращает true, если оба операнда являются true. Если первый операнд равен false, вся операция будет равна false и второй операнд не будет вычисляться.

let x = 5;

x < 4 && console.log("Это никогда не будет напечатано"); // 

x < 6 && console.log("Это будет напечатано");            // Это будет напечатано

Функция console.log() возвращает значение undefined.

Однако, в данном выражении, console.log("Это будет напечатано") не является возвращаемым значением, а скорее является “побочным эффектом” (side effect) вызова функции, который заключается в выводе на экран переданного ей аргумента.

В данном случае, выражение console.log("Это будет напечатано") выполняется только в том случае, когда x < 6 является истинным. Если x < 6 ложно, то выражение console.log("Это будет напечатано") не выполнится и ничего не будет напечатано в консоли.

Так как выражение console.log("Это будет напечатано") не является возвращаемым значением, то оператор && не будет выполнять второй операнд, если первый операнд оценивается как ложный false, и вернет значение первого ложного операнда, которым в данном случае является выражение console.log("Это будет напечатано"). Однако, если первый операнд оценивается как истинный true, то оператор && будет выполнять второй операнд и возвращать его значение, которое в данном случае будет true, поскольку выполнение выражения console.log("Это будет напечатано") завершилось успешно (хотя функция console.log() и возвращает значение undefined, оно игнорируется в данном случае).

Еще пример использования оценки короткого замыкания оператора &&:

let player = {
  health: 50,
  mana: 50,
  // ...
};

// Восстанавливаем здоровье или ману игрока, в зависимости от того, какие зелья у него есть.
let healthPotion = true;
let manaPotion = false;

player.health += healthPotion && 50; // Восстановить здоровье на 50 единиц если healthPotion = true
player.mana += manaPotion && 25;     // Восстановить ману на 25 единиц если manaPotion = true

console.log(player); // { health: 100, mana: 50 }

В данном примере, мы используем оператор && для восстановления здоровья и маны игрока, в зависимости от наличия у него соответствующих зелий.

Если healthPotion равно true, то выражение healthPotion && 50 будет оценено как 50, и игроку будет восстановлено 50 единиц здоровья. Если healthPotion равно false, выражение healthPotion && 50 будет оценено как false, и никакого восстановления здоровья не произойдет. Аналогично, если manaPotion равно true, то выражение manaPotion && 25 будет оценено как 25, и игроку будет восстановлено 25 единиц маны. Если manaPotion равно false, выражение manaPotion && 25 будет оценено как false, и никакого восстановления маны не произойдет.

Таким образом, использование оценки короткого замыкания в этом примере позволяет упростить код и избежать дополнительных проверок условий.

Оценка короткого замыкания оператора ||

Оператор || возвращает true, если хотя бы один из операндов равен true. Если первый операнд равен true, вся операция будет равна true и второй операнд не будет вычисляться.

let y = 10;

y < 5 || console.log("Это будет напечатано");             // Это будет напечатано

y < 15 || console.log("Это никогда не будет напечатано"); //

В данном случае левый операнд y < 5 ложный false, так как y равно 10, что не меньше 5. Поэтому JavaScript вычисляет и выполняет правый операнд console.log("Это будет напечатано").

Выражение вернет результат выполнения правого операнда, который в данном случае будет равен undefined, так как функция console.log() не возвращает никакого значения. Кроме того, она выведет сообщение “Это будет напечатано” в консоль.

Еще пример использования оценки короткого замыкания оператора ||

let player = {
  weapon: "sword",
  // ...
};

// Если игрок не выбрал оружие, устанавливаем значение по умолчанию - unarmed
player.weapon = player.weapon || "unarmed";

// Используем выбранное игроком оружие для атаки
function attack() {
  if (player.weapon === "sword") {
    console.log("Атака мечом");
  } else if (player.weapon === "bow") {
    console.log("Атака луком");
  } else {
    console.log("Атака оружием...");
  }
}

attack(); // Атака мечом

Оценка короткого замыкания операторов && и || одной инструкцией.

Вы также можете делать оценку коротого замыкания && и || одной инструкцией.

Пример:

let score = 100, bonus = true;

bonus && (score += 25) || (score += 1);

console.log(score); // 125

В примере выше выполняется следующее выражение: bonus && (score += 25) || (score += 1).

Давайте разберем его на части:

bonus && (score += 25)

Оператор && выполняет логическую операцию “и” между операндами bonus и (score += 25). Если bonus является истинным значением true, то вычисляется (score += 25), и переменная score увеличивается на 25. В нашем случае bonus равно true, поэтому выражение (score += 25) выполняется.  

|| (score += 1)

Если предыдущее выражение с использованием && было ложным, тогда оператор || выполняет логическую операцию “или” между предыдущим результатом и (score += 1). В этом случае (score += 1) увеличивает переменную score на 1. В нашем коде предыдущее выражение с использованием && было выполнено, поэтому это выражение с использованием || не выполняется.

Хотите освоить JavaScript и стать востребованным разработчиком?
Присоединяйтесь к курсу JavaScript Базовый уровень прямо сейчас!
Изучите основы и продвинутые концепции, создавайте интерактивные веб-приложения и воплотите свои идеи в реальности. Не упустите шанс стать экспертом в мире разработки – начните свой путь прямо сейчас!
Обнаружили ошибку в этой статье? Хотите уточнить, обновить или добавить что-то?
Все мои статьи доступны для редактирования на GitHub. Буду благодарен за любое улучшение или исправление!