Javacript использует оценку короткого замыкания для логических операторов ||
и &&
. Однако он отличается от других языков тем, что возвращает результат последнего значения, остановившего выполнение, вместо значения true
или false
.
Следующие значения считаются ложными в JavaScript.
- ложь
- нуль
""
(пустая строка)
- 0
- Nan
- неопределенный
Игнорируя правила приоритета оператора и упрощая простоту, в следующих примерах показано, какое значение остановило оценку и в результате возвращается.
false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
Первые 5 значений вплоть до NaN
являются ложными, поэтому все они оцениваются слева направо, пока не встретится первое истинное значение - "Hello"
, которое делает все выражение истинным, поэтому все дальнейшее повышение не будет оцениваться, и "Hello"
возвращается в результате выражения. Аналогично, в этом случае:
1 && [] && {} && true && "World" && null && 2010 // null
Первые 5 значений верны и оцениваются до тех пор, пока не встретится первое ложное значение (null
), которое делает выражение ложным, поэтому 2010
больше не оценивается, а null
возвращается в результате выражения.
В приведенном вами примере используется это свойство JavaScript для выполнения назначения. Его можно использовать где угодно, где вам нужно получить первое истинное или ложное значение среди набора значений. Приведенный ниже код назначит значение "Hello"
для b
, поскольку это упрощает назначение значения по умолчанию вместо выполнения проверок if-else.
var a = false;
var b = a || "Hello";
Вы можете назвать приведенный ниже пример эксплуатацией этой функции, и я считаю, что это затрудняет чтение кода.
var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);
Внутри предупреждения мы проверяем, является ли messages
ложным, и если да, то оцениваем и возвращаем noNewMessagesText
, в противном случае оцениваем и возвращаем newMessagesText
Поскольку в этом примере это неверно, мы останавливаемся на noNewMessagesText и предупреждаем "Sorry, you have no new messages."
.