Я только начал изучать JavaScript и прорешивал задачки.
И начали попадаться такие задания как:
• Чему равно 2 && 1 && null && 0 && undefined ?
• Чему равно 0 || "" || 2 || undefined || true || falsе ?
Как можно сравнивать разные типы данных?
&&
и ||
это операции логического И и ИЛИ. На вход они принимают два логических операнда и возвращает результат логического типа
В JavaScript нет строгой типизации, поэтому операнды преобразовываются к тому типу, который требуется в выражении.
Т.е. в вашем случае все операнды преобразуются в логический тип.
Алгоритм преобразования такой:
Значение | Преобразуется в...
-----------------|--------------------
undefined, null | false
Числа | Все true, кроме 0, NaN -- false.
Строки | Все true, кроме пустой строки "" -- false
Объекты | Всегда true
Если обратиться к спецификации:
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
возвращается сам операнд. В противном случае возвращается правый операнд.
В 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Хочу сделать небольшую болталку на javascriptУже использовал технологию tts (speechSynthesis), но она не оч хорошо работает в браузерах, кроме Хром
Недавно освоил теоретические основы JS и решил закрепить знания сделав слайдер