• Любые другие комбинации значений не являются равными.
В качестве примера проверки на равенство рассмотрим сравнение:
"1" == true
Результат этого выражения равен
true
, т. е. эти по-разному выглядящие значения фактически равны. Логическое значение
true
преобразуется в число 1, и сравнение выполняется снова. Затем строка 1” преобразуется в число 1. Поскольку оба числа теперь совпадают, оператор сравнения возвращает
true
.
4.9.2.
Операторы сравнения
Операторы сравнения определяют относительный порядок двух величин (числовых или строковых):
Меньше (<)
Оператор
<
возвращает
true
, если первый операнд меньше, чем второй операнд; в противном случае он возвращает
false
.
Больше (>)
Оператор
>
возвращает
true
, если его первый операнд больше, чем второй операнд; в противном случае он возвращает
false
.
Меньше или равно (<=)
Оператор
<=
возвращает
true
, если первый операнд меньше или равен второму операнду; в противном случае он возвращает
false
.
Больше или равно (>=)
Оператор
>=
возвращает
true
, если его первый операнд больше второго или равен ему; в противном случае он возвращает
false
.
Эти операторы позволяют сравнивать операнды любого типа. Однако сравнение может выполняться только для чисел и строк, поэтому операнды, не являющиеся числами или строками, преобразуются. Сравнение и преобразование выполняются следующим образом:
• Если какой-либо операнд является объектом, этот объект преобразуется в простое значение, как было описано в конце раздела 3.8.3: если метод
valueOf
объекта возвращает простое значение, используется это значение. В противном случае используется значение, возвращаемое методом
toString
.
• Если после преобразований объектов в простые значения оба операнда оказываются строками, они сравниваются как строки в соответствии с алфавитным порядком, где под «алфавитным порядком» понимается числовой порядок 16-битных значений кодовых пунктов Юникода, составляющих строки.
• Если после преобразований объектов в простые значения хотя бы один операнд не является строкой, оба операнда преобразуются в числа и сравниваются как числа. Значения 0 и -0 считаются равными. Значение
Infinity
считается больше любого другого числа, а значение
– Infinity
– меньше любого другого числа. Если какой-либо из операндов преобразуется в значение
NaN
, то оператор сравнения всегда возвращает false.
Не забывайте, что строки в JavaScript являются последовательностями 16-бит-ных целочисленных значений, и сравнение строк фактически
сводится к числовому сравнению этих значений в строках. Порядок кодирования символов, определяемый стандартом Юникода, может не совпадать с традиционным алфавитным порядком, используемым в конкретных языках или регионах. Обратите внимание, что сравнение строк производится с учетом регистра символов и все прописные буквы в кодировке ASCII «меньше» соответствующих им строчных букв ASCII. Это правило может приводить к непонятным результатам. Например, согласно оператору < строка "Zoo” меньше строки "aardvark”.
При сравнении строк более надежные результаты позволяет получить метод
String.localeCompare,
который учитывает национальные определения «алфавитного порядка». Для сравнения без учета регистра необходимо сначала преобразовать строки в нижний или верхний регистр с помощью метода
String.toLowerCase
или
String.toUpperCase.
Оператор + и операторы сравнения по-разному обрабатывают числовые и строковые операнды. Оператор + отдает предпочтение строкам: если хотя бы один из операндов является строкой, он выполняет конкатенацию строк. Операторы сравнения отдают предпочтение числам и выполняют строковое сравнение, только когда оба операнда являются строками:
1+2 // Сложение. Результат: 3.
"1" + "2" // Конкатенация. Результат: "12".
"1" +2 // Конкатенация. 2 преобразуется в "2". Результат: "12".
(больше или равно) для определения «равенства» двух значений не используют операторы равенства или идентичности. Оператор «меньше или равно» определяется просто как «не больше», а оператор «больше или равно» - как «не меньше». Единственное исключение имеет место, когда один из операндов представляет собой значение
NaN
(или преобразуется в него). В этом случае все четыре оператора сравнения возвращают
false
.
4.9.3. Оператор in
Оператор
in
требует, чтобы левый операнд был строкой или мог быть преобразован в строку. Правым операндом должен быть объект. Результатом оператора будет значение
true
, если левое значение представляет собой имя свойства объекта, указанного справа. Например:
var point = { х:1, у:1 }; // Определить объект
"х" in point // => true: объект имеет свойство с именем "х"