Чтение онлайн

на главную - закладки

Жанры

JavaScript. Подробное руководство, 6-е издание
Шрифт:

4.9. Выражения отношений

В этом разделе описаны операторы отношения в языке JavaScript. Это операторы проверяют отношение между двумя значениями (такое как «равно», «меньше» или «является ли свойством») и возвращают true или false в зависимости от того, как соотносятся операнды. Выражения отношений всегда возвращают логические значения, и эти значения чаще всего применяются в инструкциях

if, while
и
for
для управления ходом исполнения программы (глава 5). В следующих подразделах описываются операторы равенства и неравенства, операторы сравнения и два других оператора отношений,
in
и
instanceof
.

4.9.1. Операторы равенства и неравенства

Операторы

==
и
===
проверяют два значения на совпадение, используя два разных определения совпадения. Оба оператора принимают операнды любого типа и возвращают
true
, если их операнды совпадают, и
false
, если они различны. Оператор
===
, известный как оператор идентичности, проверяет два операнда на «идентичность», руководствуясь строгим определением совпадения. Оператор
==
, оператор равенства, проверяет, равны ли два его операнда в соответствии с менее строгим определением совпадения, допускающим преобразования типов.

В языке JavaScript поддерживаются операторы

=
,
==
и
===
. Убедитесь, что вы понимаете разницу между операторами присваивания, равенства и идентичности. Будьте внимательны и применяйте правильные операторы при разработке своих программ! Очень заманчиво назвать все три оператора «равно», но во избежание путаницы лучше читать оператор
=
как «получается», или «присваивается», оператор
==
читать как «равно», а словом «идентично» обозначать оператор
===
.

Операторы

!=
и
!==
выполняют проверки в точности противоположные операторам
==
и
===
. Оператор неравнства
!=
возвращает значение
false
если два значения равны друг другу в том смысле, в каком они считаются равными оператором
==
, и true в противном случае. Как будет рассказываться в разделе 4.10, оператор
!
выполняет логическую операцию НЕ. Отсюда легко будет запомнить, что операторы
!=
и
! ==
означают «не равно» и «не идентично».

Как отмечалось в разделе 3.7, объекты в языке JavaScript сравниваются по ссылке, а не по значению. Это значит, что объект равен только сам себе и не равен никакому другому объекту. Даже если два различных объекта обладают одним и тем же набором свойств, с теми же именами и значениями, они все равно будут считаться неравными. Два массива никогда не могут быть равными, даже если они содержат одинаковые элементы, следующие в одном порядке.

Оператор идентичности

===
вычисляет значения своих операндов, а затем сравнивает два значения, без преобразования типов, руководствуется следующими правилами:

• Если два значения имеют различные типы, они не идентичны.

• Если оба операнда являются значением

null
или
undefined
, они идентичны.

• Если оба операнда являются логическим значением

true
или оба являются
логическим значением
false
, они идентичны.

• Если одно или оба значения являются значением

NaN
, они не идентичны. Значение
NaN
никогда не бывает идентичным никакому значению, даже самому себе! Чтобы проверить, является ли значение х значением
NaN
, следует использовать выражение
х !== х
. Значение
NaN
– единственное, для которого такая проверка вернет
true
.

• Если оба значения являются числами с одним и тем же значением, они идентичны. Если один операнд имеет значение 0, а другой -0, они также идентичны.

• Если оба значения являются строками и содержат одни и те же 16-битные значения (подробности во врезке в разделе 3.2) в одинаковых позициях, они идентичны. Если строки отличаются длиной или содержимым, они не идентичны. Две строки могут иметь один и тот же смысл и одинаково выглядеть на экране, но содержать отличающиеся последовательности 16-битных значений. Интерпретатор JavaScript не выполняет нормализацию символов Юникода, поэтому подобные пары строк не считаются операторами

===
и
==
ни равными, ни идентичными. Другой способ сравнения строк обсуждается в части III книги, в описании метода
String.localeCompare.

• Если оба значения ссылаются на один и тот же объект, массив или функцию, то они идентичны. Если они ссылаются на различные объекты (массивы или функции), они не идентичны, даже если оба объекта имеют идентичные свойства.

Оператор равенства

==
похож на оператор идентичности, но он использует менее строгие правила. Если значения операндов имеют разные типы, он выполняет преобразование типов и пытается выполнить сравнение:

• Если два значения имеют одинаковый тип, они проверяются на идентичность, как было описано выше. Если значения идентичны, они равны; если они не идентичны, они не равны.

• Если два значения не относятся к одному и тому же типу, оператор

==
все же может счесть их равными. При этом используются следующие правила и преобразования типов:

• Если одно значение

null
, а другое -
undefined
, то они равны.

• Если одно значение является числом, а другое - строкой, то строка преобразуется в число и выполняется сравнение с преобразованным значением!

• Если какое-либо значение равно

true
, оно преобразуется в 1 и сравнение выполняется снова. Если какое-либо значение равно
false
, оно преобразуется в 0 и сравнение выполняется снова.

• Если одно из значений является объектом, а другое - числом или строкой, объект преобразуется в простой тип (как описывалось в разделе 3.8.3) и сравнение выполняется снова. Объект преобразуется в значение простого типа либо с помощью своего метода

toString
, либо с помощью своего метода
valueOf
. Встроенные классы базового языка JavaScript сначала пытаются выполнить преобразование
valueOf
, а затем
toString
, кроме класса
Date
, который всегда выполняет преобразование
toString
. Объекты, не являющиеся частью базового JavaScript, могут преобразовывать себя в значения простых типов способом, определенным их реализацией.

Поделиться:
Популярные книги

Кодекс Охотника. Книга XXVI

Винокуров Юрий
26. Кодекс Охотника
Фантастика:
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXVI

Тринадцатый

Северский Андрей
Фантастика:
фэнтези
рпг
7.12
рейтинг книги
Тринадцатый

Иной. Том 3. Родственные связи

Amazerak
3. Иной в голове
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Иной. Том 3. Родственные связи

Газлайтер. Том 27

Володин Григорий Григорьевич
27. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 27

Развод в 45. От любви до ненависти

Гофман Крис
6. Развод
Любовные романы:
остросюжетные любовные романы
5.40
рейтинг книги
Развод в 45. От любви до ненависти

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10

Лейб-хирург

Дроздов Анатолий Федорович
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Лейб-хирург

Товарищ "Чума" 6

lanpirot
6. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 6

Газлайтер. Том 16

Володин Григорий Григорьевич
16. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 16

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 10. Часть 7

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 7

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

История московских кладбищ. Под кровом вечной тишины

Рябинин Юрий Валерьевич
Научно-образовательная:
история
культурология
5.75
рейтинг книги
История московских кладбищ. Под кровом вечной тишины