Преобразование типа JavaScript: (true && 1) vs (true | | 1)

JavaScript - это не строго типизированный язык как Java, например.

Как мы знаем, он преобразует значение результата в зависимости от контекста:

"2" + "3" результаты "23"

"2" * "3" результаты 6

Это понятно и понятно для понимания.

Я просто пробовал следующие выражения и запутался:

true && 1 результаты 1
true || 1 результаты true

Почему первый дает Number, а второй дает boolean?

Учитывая правила преобразования JavaScript, я ожидаю получить значения boolean в обоих случаях из-за контекста выражения boolean.

Ответы

Ответ 1

Проверьте сайт Дугласа Крокфорда, в нем говорится:

& & оператор обычно называется логическим и. Его также можно назвать охранник. Если первый операнд имеет значение false, null, undefined, "" (пустой строка) или число 0, после чего он возвращает первый операнд. В противном случае, он возвращает второй операнд. Это обеспечивает удобный способ записи нуль-проверка:

var value = p && p.name; /* The name value will only be retrieved from
p if p has a value, avoiding an error. */

|| оператор обычно называется логическим или. Его также можно назвать по умолчанию. Если первый операнд false, null, undefined, "" (пустая строка) или число 0, то он возвращает второй операнд. В противном случае он возвращает первый операнд. Это обеспечивает удобный способ указания значений по умолчанию:

value = v || 10; /* Use the value of v, but if v doesn't have a value,
use 10 instead. */

Ответ 2

В quote MDC;

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

Итак, в первом примере возвращается 1, потому что expr1 не может быть преобразован в false.

Во втором примере true может быть преобразован в true, поэтому он вернулся.

Ответ 3

Это не имеет никакого отношения к преобразованию типов.

|| возвращает первый правдивый операнд. 1 || true даст вам 1

&& возвращает первый операнд ложности или второй операнд, если оба являются правдивыми.

См. стр. 58 спецификации ECMAScript

Ответ 5

Вы также можете делать другие вещи:

var myVar = Math.random() > 0.5;

myVar && doFunc();

что совпадает с

if(myVar) {
    doFunc();
}

|| в основном означает "Если первое - это ложь, перейдите ко второму"

&& в основном означает "Если первое верно, перейдите ко второму"

Вот почему вы видите такие вещи в верхней части функций:

function myFunction(options) {
    options = options || {};
}

Это означает: если параметры ложны, сделайте это {}

Ответ 6

Вы запутываете кастинг (операторы */+ сделают это) с логической оценкой (которые &, ||) делают.