Подтвердить что ты не робот

Почему результат строки bool (true) && является строкой в ​​javascript?

тестовый код:

console.log(true && "abc");//abc

кто может сказать мне, почему результат abc?

4b9b3361

Ответ 1

Из MDN (логические операторы) - логический и (& &):

Возвращает expr1, если его можно преобразовать в false; в противном случае возвращается expr2. Таким образом, при использовании с булевыми значениями && возвращает true, если оба операнды верны; в противном случае возвращает false.

true, очевидно, не может быть оценен как false, поэтому возвращается второе значение, которое является "abc".

Ответ 2

Оператор && в JavaScript несколько отличается от того, что на C или Java или т.д. Он всегда возвращает последнее оцениваемое значение подвыражения (имеет ли общее выражение true — "truey" /mdash; или false — "falsy" ) и не форсирует логический результат. Когда он терпит неудачу (когда одно из значений является "ложным" ), то аналогичным образом результатом является необработанное значение, а не значение булевской интерпретации.

Итак, это так: данный A && B, интерпретатор делает следующее:

  • Вычислить выражение A, дающее A V — значение A
  • Пусть A B является результатом литья A V в boolean
  • Если A B - false, то значение выражения && равно A V
  • Вычислить выражение B, давая B V
  • Возврат B V в качестве значения выражения &&.

Таким образом, в выражении if выражение && имеет тот же эффект, что и операторы boolean-casting в C или Java, потому что сам оператор if выполняет правдивый/фальшивый тест на общий результат выражение. Однако, когда он используется сам по себе, он больше напоминает "дайте мне значение второго выражения, если оно первое является правдивым, иначе дайте мне значение первого выражения".

Ответ 3

&& возвращает левую сторону, если левая сторона оценивается как false, в противном случае она возвращает размер правой руки.

true не false, поэтому он возвращает правую часть, которая является вашей строкой.

> 0 && true // LHS is false, return LHS
0
> 1 && true // LHS is true, return RHS
true
> false && 0 // LHS is false, return LHS
false
> true && false // LHS is true, return RHS
false

Ответ 4

Вы можете несколько "исправить" это, завернув выражение в !!():

!!(true && 'abc');