Проблемы со специальными значениями возможны, когда к переменной применяется операция сравнения > < <= >=, а у неё может быть как численное значение, так и null/undefined.
Интуитивно кажется, чтоnull/undefinedэквивалентны нулю, но это не так! Они ведут себя по-другому.
1. Значенияnullиundefinedравны==друг другу и не равны чему бы то ни было ещё. Это жёсткое правило буквально прописано в спецификации языка.
2. При преобразовании в числоnullстановится0, аundefinedстановитсяNaN.
Посмотрим забавные следствия.
Некорректный результат сравнения null с 0
Сравним null с нулём:
показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки
alert(null > 0); // false
alert(null == 0); // false
Итак, мы получили, что null не больше и не равен нулю. А теперь…
показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки
alert(null >= 0); // true
Как такое возможно? Если нечто «больше или равно нулю», то резонно полагать, что оно либо больше, либо равно. Но здесь это не так.
Дело в том, что алгоритмы проверки равенства == и сравнения >= > < <= работают по-разному.
Сравнение честно приводит к числу, получается ноль. А при проверке равенства значения null и undefined обрабатываются особым образом: они равны друг другу, но не равны чему-то ещё.
В результате получается странная с точки зрения здравого смысла ситуация, которую мы видели в примере выше.
Несравнимый undefined
Значение undefined вообще нельзя сравнивать:
показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки
alert(undefined > 0); // false (1)
alert(undefined < 0); // false (2)
alert(undefined == 0); // false (3)
Сравнения (1) и (2) дают false потому, что undefined при преобразовании к числу даёт NaN. А значение NaN по стандарту устроено так, что сравнения ==, <, >, <=, >= и даже === с ним возвращают false.
Проверка равенства (3) даёт false, потому что в стандарте явно прописано, что undefined равно лишь null и ничему другому.
Вывод: любые сравнения с undefined/null, кроме точного ===, следует делать с осторожностью. Желательно не использовать сравнения >= > < <=, во избежание ошибок в коде.
Итого
В JavaScript есть логические значения true (истина) и false (ложь). Операторы сравнения возвращают их.
Строки сравниваются побуквенно.
Значения разных типов приводятся к числу при сравнении, за исключением строгого равенства === (!==).
Значения null и undefined равны == друг другу и не равны ничему другому. В других сравнениях (с участием >,<) их лучше не использовать, так как они ведут себя не как 0.
Условные операторы: if, '?'
1. Оператор if
2. Преобразование к логическому типу
3. Неверное условие, else
4. Несколько условий, else if
5. Оператор вопросительный знак '?'
6. Несколько операторов '?'
7. Нетрадиционное использование '?'
Иногда, в зависимости от условия, нужно выполнить различные действия. Для этого используется оператор if.
Например:
показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки
var year = prompt('В каком году появилась спецификация ECMA-262 5.1?', '');