Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

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

#javascript


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

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

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


Ответы

Ответ 1



&& и || это операции логического И и ИЛИ. На вход они принимают два логических операнда и возвращает результат логического типа В JavaScript нет строгой типизации, поэтому операнды преобразовываются к тому типу, который требуется в выражении. Т.е. в вашем случае все операнды преобразуются в логический тип. Алгоритм преобразования такой: Значение | Преобразуется в... -----------------|-------------------- undefined, null | false Числа | Все true, кроме 0, NaN -- false. Строки | Все true, кроме пустой строки "" -- false Объекты | Всегда true

Ответ 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 возвращается сам операнд. В противном случае возвращается правый операнд.

Ответ 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

Комментариев нет:

Отправить комментарий