Почему (true && 1) возвращает 1, но (1 && true) возвращает true?

В C я знаю, что true и false оценивают 1 и 0 соответственно. show в этом случае просто печатает на экране... Не уверен, что происходит здесь. Я ожидаю получить true назад. Это 1 испортит мою карму.

show(1 && true);
true



show(true && 1);
1

Ответ 1

Проще говоря - как определяется &&. В Javascript a && b возвращает a, если a является ложным и b, если a является правдивым.

Обратно a || b возвращает a, если a является правдивым и b, если a является ложным.

Это имеет смысл интуитивно - если a ложно в a && b, то зачем читать остальную часть выражения? Вы уже знаете, что все это неверно. Так что просто верните false. Но Javascript принимает решение вернуть a, что является ложью, вместо того, чтобы присваивать значение false для возврата из ниоткуда.

Это основано на оценке короткого замыкания, общей для всех языков стиля C.

Это позволяет проявлять большую выразительность в Javascript. Например, этот шаблон:

var foo = function(opts) {
    opts = opts || {}
    // ...
}

Реализует необязательный параметр opts. Если opts вообще не передается, opts = opts || {} установит opts в {}, поэтому остальная часть кода не должна знать opts не была передана.

В долгосрочной перспективе это эквивалентно следующему:

var x = a || b; // is equivalent to
var x;
if(a) {
    x = a;
}
else {
    x = b;
}

и

var y = a && b; // is equivalent to
var y;
if(!a) {
     y = a;
}
else {
    y = b;
}

Поэтому Javascript может быть гораздо более сложным, чем C или Java, потому что простые операторы if могут быть полностью заменены на || или &&. Иногда это делает код более кратким и менее читаемым и более похожим на Perl, в других случаях он позволяет создавать новые шаблоны Javascript, например opts = opts || {}.

Другое использование в шаблонах, таких как

var displayName = user.fullname || user.email;

Это означает, что "используйте полное имя, если оно доступно, а если нет, вернитесь к электронной почте". Я лично нахожу это выразительным и удобочитаемым, но, возможно, кратким и неясным в зависимости от того, из какой части сообщества Javascript вы родом. Из-за таких примеров и, по сути, факта, что правдивые значения гораздо более разнообразны, тогда значения фальши, используя короткое замыкание ||, гораздо чаще, чем короткое замыкание &&, как в вашем вопросе.