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