В C я знаю, что true и false оценивают 1 и 0 соответственно. show
в этом случае просто печатает на экране... Не уверен, что происходит здесь. Я ожидаю получить true
назад. Это 1
испортит мою карму.
show(1 && true);
true
show(true && 1);
1
В C я знаю, что true и false оценивают 1 и 0 соответственно. show
в этом случае просто печатает на экране... Не уверен, что происходит здесь. Я ожидаю получить true
назад. Это 1
испортит мою карму.
show(1 && true);
true
show(true && 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 вы родом. Из-за таких примеров и, по сути, факта, что правдивые значения гораздо более разнообразны, тогда значения фальши, используя короткое замыкание ||
, гораздо чаще, чем короткое замыкание &&
, как в вашем вопросе.