Как работает || оператор в JavaScript [дубликат]

238
09 января 2018, 11:44

На данный вопрос уже ответили:

  • Есть ли разница между выражениями !!( a && b ) и (a && b)? 2 ответа
var obj = {};
var x = obj.zz || 2; // почему эта строчка так срабатывает?
alert(x); // выводит 2

obj.zz == undefined это понятно, поэтому он вычисляет второй аргумен 2, но почему результат выражения кладётся в x?

Почему он туда не true кладёт, если операция булевская?

К чему вопрос возник. Ищу аналог ?? из C#.

int? pageFromUrl;
int page = pageFromUrl ?? 1;

Правильно ли я понимаю что obj.zz || 2 из JavaScript это аналог obj.zz ?? 2 из C#?

Answer 1

Из спецификации.

Note: the value produced by a && or || operator is not necessarily of type Boolean. The value produced will always be the value of one of the two operand expressions.

По-русски.

Заметьте: значение, возвращаемое опретором && или опретором || не обязательно типа Boolean. Однако это значение всегда будет одного типов операндов.

Что это значит?

false || true

Вернет true.

false || 1

Вернет 1

0 || "str"

Вернет str

При этом если оба операнда - thruthy, то вернется первый из них:

true || 1

Вернет true

А если оба операнда - falthy, то вернется последний:

false || 0

Вернет 0

Почему он туда не true кладёт, если операция булевская?

Верно подмечено, на самом деле. Но то, что операция логическая не значит, что и возвращаемое значение будет представлено Boolean значением, как видно из примеров выше и как указано в спецификации.

Answer 2

В общем, как я понимаю, это еще один из "трюков" js:

a = a || 0

превратит a из любого "falsey"-значения в 0 (извините, даже не представляю, как это правильно перевести.

При этом, к falssey значениям отноcятся:

  • false
  • null
  • undefined
  • 0
  • "" (empty string)
  • NaN (not a Number)
READ ALSO
Как написать правильно еxpression-bodied function member в SharpDevelop

Как написать правильно еxpression-bodied function member в SharpDevelop

Хочу написать второй метод ToString(Object obj) через лямбда выражение:

212
Добавление через код событие кнопки с аргументом

Добавление через код событие кнопки с аргументом

Хочу массиву кнопкам, из 10 кнопок передать в событие OnClick метод Appropriation(i), с аргументом i, который будет увеличиватьсяСуть: кнопка 1 имеет OnClick...

180
В чём разница между Convert.ToString, ToString и (String)?

В чём разница между Convert.ToString, ToString и (String)?

Например есть некая переменная:

254
Необработанное исключение System.Reflection.TargetInvocationException и BackgroundWorker

Необработанное исключение System.Reflection.TargetInvocationException и BackgroundWorker

Изучаю BackgroundWorker, решил попробовать на своей программе (при проверке обновлений), добавив BackgroundWorkerВроде сделал всё примерно как на msdn, но программа...

210