Главная страница

Работы по JavaScript. JavaScript с Ильей Кантором


Скачать 0.61 Mb.
НазваниеJavaScript с Ильей Кантором
АнкорРаботы по JavaScript.docx
Дата03.09.2018
Размер0.61 Mb.
Формат файлаdocx
Имя файлаРаботы по JavaScript.docx
ТипДокументы
#24011
страница5 из 9
1   2   3   4   5   6   7   8   9

Сравнение разных типов


При сравнении значения преобразуются к числам. Исключение: когда оба значения — строки, тогда не преобразуются.

Например:

показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки

   

1

alert( '2' > 1 ); // true

2

alert( '01' == 1 ); //true




3

alert( false == 0 ); // true, false становится 0, а true 1.

Тема преобразований типов будет продолжена далее, в главе Преобразование объектов: toString и valueOf.

Строгое равенство


Обычное равенство не может отличить 0 от false:
показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки

   

1

alert(0 == false); // true, т.к. false преобразуется к 0

Что же делать, если все же нужно отличить 0 от false?

Для проверки равенства без преобразования типов используются операторы строгого равенства === (тройное равно) и !==.

Они сравнивают без приведения типов. Если тип разный, то такие значения всегда неравны (строго):
показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки

   

1

alert(0 === false); // false, т.к. типы различны

Сравнение с null и undefined


Проблемы со специальными значениями возможны, когда к переменной применяется операция сравнения > < <= >=, а у неё может быть как численное значение, так и null/undefined.

Интуитивно кажется, что null/undefined эквивалентны нулю, но это не так! Они ведут себя по-другому.

  1. Значения null и undefined равны == друг другу и не равны чему бы то ни было ещё.
    Это жёсткое правило буквально прописано в спецификации языка.

  2. При преобразовании в число null становится 0, а undefined становится NaN.

Посмотрим забавные следствия.

Некорректный результат сравнения null с 0

Сравним null с нулём:
показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки

   

1

alert(null > 0); // false

2

alert(null == 0); // false

Итак, мы получили, что null не больше и не равен нулю. А теперь…
показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки

   

1

alert(null >= 0); // true

Как такое возможно? Если нечто «больше или равно нулю», то резонно полагать, что оно либо больше, либо равно. Но здесь это не так.

Дело в том, что алгоритмы проверки равенства == и сравнения >= > < <= работают по-разному.

Сравнение честно приводит к числу, получается ноль. А при проверке равенства значения null и undefined обрабатываются особым образом: они равны друг другу, но не равны чему-то ещё.

В результате получается странная с точки зрения здравого смысла ситуация, которую мы видели в примере выше.

Несравнимый undefined

Значение undefined вообще нельзя сравнивать:
показать чистый исходник в новом окнеСкрыть/показать номера строкпечать кода с сохранением подсветки

   

1

alert(undefined > 0); // false (1)

2

alert(undefined < 0); // false (2)




3

alert(undefined == 0); // false (3)

  • Сравнения (1) и (2) дают false потому, что undefined при преобразовании к числу даёт NaN. А значение NaN по стандарту устроено так, что сравнения ==, <, >, <=, >= и даже === с ним возвращают false.

  • Проверка равенства (3) даёт false, потому что в стандарте явно прописано, что undefined равно лишь null и ничему другому.

Вывод: любые сравнения с undefined/null, кроме точного ===, следует делать с осторожностью. Желательно не использовать сравнения >= > < <=, во избежание ошибок в коде.
1   2   3   4   5   6   7   8   9


написать администратору сайта