Преобразование типов JavaScript: (true && 1) против (true | | 1) - PullRequest
16 голосов
/ 19 декабря 2011

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

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

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

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

Это совершенно ясно и хорошо для понимания.

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

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

Почему первый дает номер, а второй дает логическое значение?

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

Ответы [ 6 ]

9 голосов
/ 19 декабря 2011

Это не имеет ничего общего с преобразованием типов.

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

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

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

9 голосов
/ 19 декабря 2011

К цитата MDC ;

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

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

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

8 голосов
/ 19 декабря 2011

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

Оператор && обычно называется логическим и. Это также можно назвать охранник. Если первый операнд имеет значение 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. */

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

value = v || 10; /* Use the value of v, but if v doesn't have a value,
use 10 instead. */
2 голосов
/ 19 декабря 2011

true && 1 => это всегда будет возвращать последнее значение &&, если все условия являются истинными или ложными в противном случае

true || 1 => это всегда будет возвращать первое истинное значение

Ресурсы:

http://www.ecma -international.org / публикации / файлы / ECMA-ST-ARCH / ECMA-262,% 203-й% 20-е издание,% 20-декабрь% 201999.pdf

0 голосов
/ 19 декабря 2011

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

0 голосов
/ 19 декабря 2011

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

var myVar = Math.random() > 0.5;

myVar && doFunc();

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

if(myVar) {
    doFunc();
}

. || в основном означает «Если первое неверно, перейдите кsecond "

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

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

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

Что означает: если параметры не соответствуют действительности, сделайте это {}

...