###Коротко
Вычисляет выражения слева, если результат вычисления имеет булевый эквивалент true
, возвращает это значение, не вычисляя выражение справа. Иначе, если результат вычисления левой части оператора имеет булевый эквивалент false
, вычисляет значение правой части оператора, и вся запись вычисляется во второе значение.
###В деталях
Общий вид оператора “или”: EXPRESSION_1 || EXPRESSION_2
. Где EXPRESSION_1
и EXPRESSION_2
- некоторые выражения, вычисляемые в значение.
var a = -3;
var greetingMessage;
var DEFAULT_MESSAGE = 'Hey there!';
var x;
a || true;
greetingMessage || DEFAULT_MESSAGE;
a > 0 || a < -10
true || (x = 1);
Пусть значение, в которое вычисляется EXPRESSION_1
будет VALUE_1
, и значение, в которое вычисляется EXPRESSION_2
будет VALUE_2
.
Посмотрим (в комментарии) во что вычисляются экспрешены из левых и правых частей оператора ИЛИ из кода выше, если попробовать выполнить их просто из консоли:
var a = -3;
var greetingMessage;
var DEFAULT_MESSAGE = 'Hey there!';
var x;
a; // -3
true; // true
greetingMessage; // undefrined
DEFAULT_MESSAGE; // "Hey there!"
a > 0; // false
a < -10; // false
true; // true
(x = 1) // 1. Кроме этого в переменную x присваивается значение 1
Результат вычисления оператора - одно из значений выражений VALUE_1
или VALUE_2
. Важно понимать, что логическое ИЛИ не всегда вычисляется в булевое значение.
Сначала оператор или
вычисляет значение левого экспрешена. Считай выполняется код слева, вычислять в VALUE_1
. Если булевый эквивалент VALUE_1
является true
, оператор или
вычисляется в VALUE_1
, и код EXPRESSION_2
не выполняется. Это и есть ленивость оператора, когда выражение справа не вычисляется (считай код справа не выполняется).
var a = -3;
a || 3; // -3, так как булевый эквивалент -3 - true
var x;
true || (x = 1); // true
console.log(x); // undefined, так как в выражение, в котором в x присваивается значение единица, не вычислялось.
Если булевый эквивалент VALUE_1
- false
, то вычисляется значение VALUE_2
, и результат вычисления всего оператора становится значение VALUE_2
var a = -3;
var greetingMessage;
var DEFAULT_MESSAGE = 'Hey there!';
var x;
greetingMessage || DEFAULT_MESSAGE; // 'Hey there!';
a > 0 || a < -10; // false