Оценка короткого замыкания, минимальная оценка или Оценка Джона Маккарти (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. В нашем коде предыдущее выражение с использованием && было выполнено, поэтому это выражение с использованием || не выполняется.