Логический оператор && и две строки в javascript
Когда я использую логический оператор && между двумя строками, почему он дает мне вторую строку в качестве вывода:
console.log("" && "Dog"); // ""
console.log("Cat" && "Dog"); // "Dog"
Ответы
Ответ 1
в выражении
"Cat" && "Dog"
// => "Dog"
Поскольку вы используете &&
, JavaScript обещает вам, что он проверит, что обе стороны выражения true
. В этом случае "Dog"
- это последняя оцененная вещь.
Чтобы быть более явным, вы могли бы сделать что-то вроде
var c = "Cat" != null && "Dog" != null
Это немного более многословно, но это сводится к
var c = true && true
console.log(c)
// => true
Если вы хотите простой ярлык для логического значения, используйте конструктор Boolean
-
var c = Boolean("Cat" && "Dog")
console.log(c)
// => true
Если вы просто используете простую консоль REPL или JavaScript, вы сможете увидеть этот вывод очень легко.
За один из комментариев ниже
Использование ||
JavaScript обещает вам, что хотя бы одна из сторон true
. Так как "Cat" истинно, он останавливается и возвращает "Cat". Это известно как оценка короткого замыкания
Ответ 2
Ответа на этот вопрос @naomik очень нравится. Если вы хотите углубляться, я предлагаю взглянуть на спецификацию ECMAScript, раздел 11.11:
http://www.ecma-international.org/ecma-262/5.1/#sec-11.11
В разделе "Семантика" мы можем видеть:
Производство LogicalANDExpression: LogicalANDExpression && & BitwiseORExpression оценивается следующим образом:
- Пусть lref является результатом оценки LogicalANDExpression.
- Пусть lval - GetValue (lref).
- Если ToBoolean (lval) false, верните lval.
- Пусть rref является результатом оценки BitwiseORExpression.
- Возвращает GetValue (rref).
Ответ 3
Я думаю, что это из-за природы логического оператора & &. Javascript выполняет выражение "cat" && "Dog"
следующим образом:
Проверяет значение "cat" - оно возвращает что-то другое, чем ", 0, null, undefined или false и является правдивым. Javascript видит &&
, и поэтому он продолжает выражение и сталкивается с строкой" Собака ", которая является чем-то другим, чем" ", 0, null, undefined или false и является правдивой, выражение заканчивается, а выражение возвращает последнее проверенное значение.
Если вы замените &&
на ||
, выражения заканчиваются с первым значением правды и thats way
var boolean = "cat" || "dog"
возвращает первое значение: cat
Ответ 4
Из-за того, как работает логика, если вам нужно проверить, являются ли оба элемента истинными, и вы уже знаете, что первый элемент истинен, тогда тест полностью зависит от второго элемента.
правда && someValue эквивалентно просто someValue
По этой причине оператор & можно обработать, возвращая его операнды вместо значений true/false и просто проверяя первый операнд, а не второй
& & б:
если a оценивается как false, нет необходимости тестировать дальше, вернуть (как false)
в противном случае, если значение a равно true, результат полностью зависит от b, поэтому просто верните b (нет необходимости проверять, имеет ли b значение true или false, просто верните его)
В коде это похоже на
function and(a,b) {
if(!a) return a;
return b;
}
Аналогично оператор || можно определить как
function or(a,b) {
if(a) return a;
return b;
}
Возврат операндов вместо true/false имеет несколько преимуществ:
требуется меньше оценок (в обоих случаях уведомление b никогда не оценивается)
не требует определения true/false, поэтому он работает более широко, даже на разных языках или если значение "true" меняется
может быть "взломан" для использования, без if, для таких вещей, как string1 && строка2, которая имеет полезное значение: "если строка1 не пуста, используйте строку2, в противном случае оставьте ее пустой (чтобы заменить каждое слово строки текстом" слово ": aString.split(" ").map(function(word) {return word && "word"});
JavaScripters любят подобные вещи (используя побочный эффект одного оператора из обычного контекста, чтобы получить другое, неожиданное поведение), они делают это, чтобы показать знание языка на вечеринках.: D