Преобразование типа 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
Ответ 4
true && 1
= > это всегда будет возвращать последнее значение && если все условия верны или ложны иначе
true || 1
= > это всегда будет возвращать первое значение "правды"
Ресурсы
http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf
Ответ 5
Вы также можете делать другие вещи:
var myVar = Math.random() > 0.5;
myVar && doFunc();
что совпадает с
if(myVar) {
doFunc();
}
||
в основном означает "Если первое - это ложь, перейдите ко второму"
&&
в основном означает "Если первое верно, перейдите ко второму"
Вот почему вы видите такие вещи в верхней части функций:
function myFunction(options) {
options = options || {};
}
Это означает: если параметры ложны, сделайте это {}
Ответ 6
Вы запутываете кастинг (операторы */+ сделают это) с логической оценкой (которые &, ||) делают.