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