На данный вопрос уже ответили:
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#?
Из спецификации.
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 значением, как видно из примеров выше и как указано в спецификации.
В общем, как я понимаю, это еще один из "трюков" js:
a = a || 0
превратит a из любого "falsey"-значения в 0 (извините, даже не представляю, как это правильно перевести.
При этом, к falssey значениям отноcятся:
falsenullundefined0"" (empty string)NaN (not a Number)Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости