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

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

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

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

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

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

• Любые другие комбинации значений не являются равными.

В качестве примера проверки на равенство рассмотрим сравнение:

<b>&quot;1&quot; == true</b>

Результат этого выражения равен

<b>true</b>
, т. е. эти по-разному выглядящие значения фактически равны. Логическое значение
<b>true</b>
преобразуется в число 1, и сравнение выполняется снова. Затем строка 1” преобразуется в число 1. Поскольку оба числа теперь совпадают, оператор сравнения возвращает
<b>true</b>
.

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

Операторы сравнения определяют относительный порядок двух величин (числовых или строковых):

Меньше (<)

Оператор

<b>&lt;</b>
возвращает
<b>true</b>
, если первый операнд меньше, чем второй операнд; в противном случае он возвращает
<b>false</b>
.

Больше (>)

Оператор

<b>&gt;</b>
возвращает
<b>true</b>
, если его первый операнд больше, чем второй операнд; в противном случае он возвращает
<b>false</b>
.

Меньше или равно (<=)

Оператор

<b>&lt;=</b>
возвращает
<b>true</b>
, если первый операнд меньше или равен второму операнду; в противном случае он возвращает
<b>false</b>
.

Больше или равно (>=)

Оператор

<b>&gt;=</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>
, то оператор сравнения всегда возвращает false.

Не забывайте, что строки в JavaScript являются последовательностями 16-бит-ных целочисленных значений, и сравнение строк фактически сводится к числовому сравнению этих значений в строках. Порядок кодирования символов, определяемый стандартом Юникода, может не совпадать с традиционным алфавитным порядком, используемым в конкретных языках или регионах. Обратите внимание, что сравнение строк производится с учетом регистра символов и все прописные буквы в кодировке ASCII «меньше» соответствующих им строчных букв ASCII. Это правило может приводить к непонятным результатам. Например, согласно оператору < строка "Zoo” меньше строки "aardvark”.

При сравнении строк более надежные результаты позволяет получить метод

<b>String.localeCompare(),</b>
который учитывает национальные определения «алфавитного порядка». Для сравнения без учета регистра необходимо сначала преобразовать строки в нижний или верхний регистр с помощью метода
<b>String.toLowerCase()</b>
или
<b>String.toUpperCase().</b>

Оператор + и операторы сравнения по-разному обрабатывают числовые и строковые операнды. Оператор + отдает предпочтение строкам: если хотя бы один из операндов является строкой, он выполняет конкатенацию строк. Операторы сравнения отдают предпочтение числам и выполняют строковое сравнение, только когда оба операнда являются строками:

<b>1+2 // Сложение. Результат: 3.</b>

<b>&quot;1&quot; + &quot;2&quot; // Конкатенация. Результат: &quot;12&quot;.</b>

<b>&quot;1&quot; +2 // Конкатенация. 2 преобразуется в &quot;2&quot;. Результат: &quot;12&quot;.</b>

<b>11 &lt; 3 // Числовое сравнение. Результат: false.</b>

<b>&quot;11&quot; &lt; &quot;3&quot; // Строковое сравнение. Результат: true.</b>

<b>”11&quot; &lt; 3 // Числовое сравнение. &quot;11&quot; преобразуется в 11. Результат: false</b>

<b>&quot;one&quot; &lt; 3 // Числовое сравнение, &quot;one&quot; преобразуется в NaN. Результат: false.</b>