тестовый код:
console.log(true && "abc");//abc
кто может сказать мне, почему результат abc
?
тестовый код:
console.log(true && "abc");//abc
кто может сказать мне, почему результат abc
?
Из MDN (логические операторы) - логический и (& &):
Возвращает expr1, если его можно преобразовать в false; в противном случае возвращается expr2. Таким образом, при использовании с булевыми значениями && возвращает true, если оба операнды верны; в противном случае возвращает false.
true
, очевидно, не может быть оценен как false, поэтому возвращается второе значение, которое является "abc".
Оператор &&
в JavaScript несколько отличается от того, что на C или Java или т.д. Он всегда возвращает последнее оцениваемое значение подвыражения (имеет ли общее выражение true — "truey" /mdash; или false — "falsy" ) и не форсирует логический результат. Когда он терпит неудачу (когда одно из значений является "ложным" ), то аналогичным образом результатом является необработанное значение, а не значение булевской интерпретации.
Итак, это так: данный A && B
, интерпретатор делает следующее:
false
, то значение выражения &&
равно A V&&
.Таким образом, в выражении if
выражение &&
имеет тот же эффект, что и операторы boolean-casting в C или Java, потому что сам оператор if
выполняет правдивый/фальшивый тест на общий результат выражение. Однако, когда он используется сам по себе, он больше напоминает "дайте мне значение второго выражения, если оно первое является правдивым, иначе дайте мне значение первого выражения".
&&
возвращает левую сторону, если левая сторона оценивается как 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
Вы можете несколько "исправить" это, завернув выражение в !!()
:
!!(true && 'abc');