&& и || с разными типами данных

242
23 октября 2018, 20:10

Я только начал изучать JavaScript и прорешивал задачки.

И начали попадаться такие задания как:
• Чему равно 2 && 1 && null && 0 && undefined ?
• Чему равно 0 || "" || 2 || undefined || true || falsе ?

Как можно сравнивать разные типы данных?

Answer 1

&& и || это операции логического И и ИЛИ. На вход они принимают два логических операнда и возвращает результат логического типа

В JavaScript нет строгой типизации, поэтому операнды преобразовываются к тому типу, который требуется в выражении.

Т.е. в вашем случае все операнды преобразуются в логический тип.

Алгоритм преобразования такой:

Значение         | Преобразуется в...
-----------------|--------------------
undefined, null  | false
Числа            | Все true, кроме 0, NaN -- false.
Строки           | Все true, кроме пустой строки "" -- false
Объекты          | Всегда true
Answer 2

Если обратиться к спецификации:

LogicalANDExpression : LogicalANDExpression && BitwiseORExpression
1. Пусть lref результат вычисления LogicalANDExpression.
2. Пусть lval будет результатом GetValue(lref).
3. Пусть lbool результат ToBoolean(lval).
4. Если lbool - false, вернуть lval.
5. Пусть rref это результат вычисления BitwiseORExpression.
6. Вернуть GetValue(rref).

В случае && левый операнд приводится к bool и если значение false возвращается сам операнд. В противном случае возвращается правый операнд.

LogicalORExpression : LogicalORExpression || LogicalANDExpression
1. Пусть lref результат вычисления LogicalORExpression.
2. Пусть lval будет результатом GetValue(lref).
3. Пусть lbool результат ToBoolean(lval).
4. Если lbool - true, вернуть lval.
5. Пусть rref это результат вычисления LogicalANDExpression.
6. Вернуть GetValue(rref).

В случае || левый операнд приводится к bool и если значение true возвращается сам операнд. В противном случае возвращается правый операнд.

Answer 3

В javascript такие вопросы решаются очень просто: приведением типов ( в данном случае будет приводится к булевому типу )

Зачем это нужно?

В javascript && и || ленивые операторы, то есть они не всегда будут высчитывать все значения. Например: если мы используем &&, то true будет только в том случае, если обе переменные true

true && false // false
false && false // false
true && true // true
false && true // false

В последнем примере нам даже не обязательно высчитывать значение второй переменной, так как первая false, то мы уже точно знаем, что результат тоже будет false. Этим можно воспользоваться в некоторых ситуациях

const element = document.getElementById('id'); // какой-то элемент
//теперь представим, что нам нужно что-то сделать с этим элементом
// в случае если он есть на странице
// можно сделать так
if(element) {
    someFn(element);
}
// а можно короче воспользовавшись ленивостью оператора &&
element && someFn(element); // someFn вызовется только если element true

В доказательство, что движок даже не смотрит изначально за && в том, что

false && arueybgqnreugnqgr(); // все ок

То же самое с ||, только его используют для других целей:

const fn = param => {
    return param || 42 // по сути так мы устанавливаем значение по умолчанию
}
fn(10); // 10
fn(); // 42
fn(0); // тоже 42, потому что !!0 === false

Пустая строка, 0, undefined, NaN, null (кажется, ничего не забыл ) - приводятся к false. Остальное к true, причем:

!![]; // true
!!({}); // true
READ ALSO
как создать голосового помощника на javascript?

как создать голосового помощника на javascript?

Хочу сделать небольшую болталку на javascriptУже использовал технологию tts (speechSynthesis), но она не оч хорошо работает в браузерах, кроме Хром

223
Реализация слайдера на чистом JavaScript

Реализация слайдера на чистом JavaScript

Недавно освоил теоретические основы JS и решил закрепить знания сделав слайдер

183