Как работает логический оператор ИЛИ. Ленивость

###Коротко

Вычисляет выражения слева, если результат вычисления имеет булевый эквивалент 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
8 Симпатий