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

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

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

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

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

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

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

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

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

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


person sergionni    schedule 19.12.2011    source источник


Ответы (6)


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

Оператор && обычно называют логическим и. Его также можно назвать сторожевым. Если первый операнд имеет значение 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. */
person Tim Büthe    schedule 19.12.2011
comment
спасибо за пояснение - интересный момент про гуард и дефолт - person sergionni; 19.12.2011
comment
Пожалуйста. В общем, я бы порекомендовал прочитать страницу Дугласа о JavaScript вместо спецификации. По моему так намного проще понять. javascript.crockford.com - person Tim Büthe; 19.12.2011
comment
Отличное объяснение! Хотел бы я поставить вам +3. - person Old Pro; 11.05.2013
comment
@OldPro хорошо, спасибо, но нужно отдать должное, это все Дуглас Крокфорд. - person Tim Büthe; 12.05.2013

Чтобы цитировать MDC;

&&; Returns expr1 if it can be converted to false; otherwise, returns expr2. Thus, when used with Boolean values, && returns true if both operands are true; otherwise, returns false.
||; Returns expr1 if it can be converted to true; otherwise, returns expr2. Thus, when used with Boolean values, || returns true if either operand is true; if both are false, returns false.

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

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

person Matt    schedule 19.12.2011
comment
большое спасибо, на самом деле вы напомнили мне, что ресурс Mozilla очень ценен в качестве документации JavaScript - person sergionni; 19.12.2011

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

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

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

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

person Paul Butcher    schedule 19.12.2011

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

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

Ресурсы:

http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf

person alessioalex    schedule 19.12.2011

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

var myVar = Math.random() > 0.5;

myVar && doFunc();

что то же самое, что

if(myVar) {
    doFunc();
}

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

&& в основном означает «Если первое верно, переходите ко второму».

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

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

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

person paulslater19    schedule 19.12.2011

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

person Graham    schedule 19.12.2011