В этом уроке описаны операторы сравнения. Эти операторы (такие как «меньше» <, «больше» >, «меньше или равно» <= и т.д.) проверяют равенство или неравенство операндов и возвращают в качестве результата значение true или false в зависимости от того, как соотносятся операнды.
JavaScript: Операторы сравнения
Операторы сравнения позволяют сравнивать два значения между собой и, если условие выполнено, возвращают true, а если нет — false.
Выражения сравнения всегда возвращают логические значения, которые широко применяются в инструкциях if, for для управления ходом исполнения программы.
Полный список операторов сравнения в JavaScript приведен в следующей таблице:
| Оператор | Описание | Пример | Результат |
|---|---|---|---|
| == | Равно | 10 == 20 | false |
| === | Строго равно (идентичность) | "20" === 20 | false |
| != | Не равно | 10 != 20 | true |
| !== | Строго не равно | 20! == 20 | false |
| > | Больше чем | 20 > 10 | true |
| >= | Больше или равно | 20 >= 10 | true |
| < | Меньше чем | 20 < 10 | false |
| <= | Меньше или равно | 20 <= 10 | false |
Равенство (==) и неравенство (!=)
Оба оператора принимают операнды любого типа и, если операнды равны, оператор равенства == возвращает true, а оператор неравенства != возвращает – false.
Получив операнды разных типов, эти операторы пытаются привести их к одному типу и сравнивают уже преобразованные значения.
При преобразовании типов операторы равенства == и неравенства != руководствуется следующими правилами:
- Если какой-либо операнд число или булево значение, то операнды преобразуются в числа, при этом
trueпреобразуется в 1, аfalseпреобразуется в 0. - Если какой-либо операнд строка – второй преобразуются в строку.
- Если одно из значений представляет собой объект, а другое – число или строку, то объект преобразуется в элементарный тип.
При сравнении операндов также применяются свои правила:
- Если одно из значений равно
null, а другое –undefined, то они равны. - Значения
nullиundefinedне преобразуются для сравнения ни в какие другие значения. - Значение
NaNсчитается не равным никакому другому значению, включая само себя. При его наличии оператор равенства всегда возвращаетfalse, а оператор неравенства –true. - Если оба операнда являются объектами, то они сравниваются, чтобы выяснить, один ли это
объект. Если да, возвращается
true, иначе –false.
Примеры:
Примечание: Значения null и undefined равны == друг другу и не равны ничему другому.
Строгое равенство (===) и строгое неравенство (!==)
Операторы строгих равенства и неравенства, известные также как операторы идентичности === и неидентичности !==, делают то же самое, что и обычные операторы равенства и неравенства, но не преобразуют типы операндов перед их сравнением.
Оператор идентичности === возвращает true, только если операнды равны без преобразования:
- Если оба операнда имеют примитивные типы и содержат одинаковые значения, они считаются равными.
- Два операнда считаются равными, если оба ссылаются на один и тот же объект. Если же они ссылаются на разные объекты, они не равны, даже если эти объекты имеют идентичные свойства.
- Оператор идентичности считает значение
NaNне равным никакому другому значению, включая само себя. При его наличии оператор идентичности всегда возвращаетfalse.
В противоположность оператору идентичности === оператор неидентичности !== возвращает true, если без преобразования операнды не равны.
На заметку: Выражение null == undefined истинно, потому что значения равны, но null === undefined ложно, потому что типы этих значений разные.
Операторы отношений: (>), (<), (>=), (<=)
Как работают операторы отношений «больше» >, «меньше» <, «больше или равно» >= и «меньше или равно» <= нам известно ещё из школьной математики. Каждый из этих операторов возвращает логическое значение (true или false).
Оператор больше > возвращает true, если значение левого операнда больше, чем значение правого операнда, в противном случае он возвращает false:
alert(7 > 5); // true
alert(5 > 7); // falseОператор меньше < возвращает true, если значение левого операнда меньше, чем значение правого операнда, в противном случае он возвращает false:
alert(7 < 5); // true
alert(5 < 7); // falseОператор больше или равно >= возвращает true, если значение левого операнда больше или равно, чем значение правого операнда, в противном случае он возвращает false:
alert(7 >= 5); // true
alert(5 >= 5); // trueОператор меньше или равно <= возвращает true, если значение левого операнда меньше или равно, чем значение правого операнда, в противном случае он возвращает false:
alert(5 <= 7); // true
alert(5 <= 5); // trueСравнение строк
Если оператор отношения применяется к двум строкам, то сравнение происходит побуквенно/посимвольно. То есть сравнение происходит так: каждый символ (буква) первой строки сравнивается с соответствующим символом второй строки и так, до того момента, пока символы не будут разными, и тогда какой символ больше – та строка и больше. Если же в одной из строк закончились символы, то считаем, что она меньше, а если закончились в обеих – строки равны.
Теперь разберем, как происходит сравнение каждого символа. Каждый символ переводится в числовое значение, согласно кодировке Unicode, и суть сравнения символов сводиться к сравнению двух чисел. Например, десятичные (Dec) значения символов кирилицы лежат в диапазоне от 1024 до 1280.
Пример:
var str1 = "Апельсин";
var str2 = "абрикос";Начинаем сравнивать первые символы: str1[0] (буква "А") и str2[0] (буква "а").
В JavaScript, как и в других языках програмирования, есть метод для получения цифрового кода из символа:
str.charCodeAt(pos);Метод возвращает код символа расположенного на позиции pos в строке str. Отсчет позиций символов в строке начинается с нуля.
Если бы первые символы строк были равны, то дальше сравнивались бы следующие символы попарно.
В этом примере строка "Апельсин" считается меньше, чем строка "абрикос", потому что буква "А" имеет код 1040, а буква "а" – 1072. Причина в том, что коды прописных букв всегда меньше, чем строчных.
Чтобы правильно сравнить строки по алфавиту, необходимо перед сравнением преобразовать оба операнда в один регистр (например, в нижний):
После преобразования в нижний регистр слово "апельсин" становится больше, чем слово "абрикос", потому что вторая буква "п" имеет код 1087, а вторая буква "б" переменной str2 – 1073.
Примечание: Обычно, буква расположенная в алфавитном порядке раньше имеет меньший числовой код, чем буква (в том же регистре) расположенная в алфавитном порядке после неё.
Не менее интересная ситуация складывается при сравнении чисел, предствленных в строковой форме, например:
В примере выше "15" < "5", потому что числа, представленные в виде строк, сравниваются как строки. Строковые операнды, как вы уже знаете, сравниваются по кодам знаков (код знака "1" – 49, код знака "5" – 53 ).
Если хотя бы один операнд изменить на число, то другой будет преобразован к числу:
В этом примере строка "15" преобразуется в число 15, а затем производится сравнение полученных чисел.
На заметку: Когда строка сравнивается с числом, она преобразуется в число и выполняется числовое сравнение операндов.
В случае, когда строку невозможно преобразовать в число, она преобразуется в NaN. Как правило, в результате любой операции сравнения с операндом NaN получается false:
Итоги
- Операторы сравнения сравнивают значения операндов и возвращают логическое значение –
trueилиfalseв зависимости от результатов проверки. - При сравнении операнды, имеющие значения разных типов, приводятся к числовому значению, за исключением сравнения на идентичность
===и неидентичность!==. - При сравнении строк, сравнение происходит побуквенно: каждый символ переводится в числовое значение, согласно кодировке Unicode, и суть сравнения символов сводиться к сравнению двух чисел.
- Код буквы в нижнем регистре всегда больше, чем код буквы в верхнем регистре.
- Код цифры находящейся в строке всегда меньше кода буквенного символа в любом регистре.
- Как правило, код буквы, расположенной в алфавитном порядке раньше имеет меньшее значение, чем код буквы (в том же регистре), расположенной в алфавитном порядке после неё.
- Операторы сравнения считают значение
NaNне равным никакому другому значению, включая само себя. - Значения
nullиundefinedНЕ СТРОГО равны==друг другу. - При преобразовании в число
nullстановится 0, аundefinedстановитсяNaN.
Задачи
-
Выберите правильный оператор сравнения между двумя выражениями, чтобы отобразить «true»:
Показать решениеvar a = "" + 1 + 0; var b = 9; alert( a /*оператор сравнения*/ b ); // trueРешение:
После сложения значением переменной
aстанет строка "10". При сравнении с числом строка "10" будет преобразована в число 10. Ответ: «больше» (>) или «больше или равно» (>=).-
Выберите правильный оператор сравнения между двумя выражениями, чтобы отобразить «false»:
Показать решениеvar a = "" - 1 + 0; var b = true + false; alert( a /*оператор сравнения*/ b ); // falseРешение:
После сложения значением переменной
aстанет число (-1), а значением переменнойb– число (1). Ответ: «больше» (>), «равно» (==), «идентично» (===) или «больше или равно» (>=).-
Какой результат будет у выражений ниже: true или false?
Показать решениеalert( ("2" * "3") > (9 / "3") ); alert( ("4" * 2) == ("4px" * 2) ); alert( ("4" - 2) == ("4px" - 2) );Решение:
Так как умножение, деление и вычетание производятся только с числами, JavaScript превращает строку в число, если это возможно. В противном случае, результат —
NaN. Первое выражение: 6 > 3 // true. Второе выражение: 8 == NaN // false. Третье выражение: 2 == NaN // false.-
Верны ли следующие выражения? Почему?
Показать решениеnull + 1 == 1 // true undefined + 1 == NaN // false null == "0" // false +null == +"0" // trueРешение:
При преобразовании в число
nullстановится 0, аundefinedстановитсяNaN. Поэтому с первыми двумя выражениями всё понятно: 1 == 1 // true; NaN == NaN // false, т.к. значение NaN не равно никакому другому значению, включая само себя. В третьем выраженииnullсравнивается со строкой "0". В четвертом выражении унарный плюс преобразует операнды в числа, поэтомуnullсравнивается с числом 0.
-
-
-


Комментарии
<code>, несколько строчек кода — в теги<pre><code>...ваш код...</code></pre>.