Логический оператор && и две строки в 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