--- title: Операторы сравнения slug: >- conflicting/Web/JavaScript/Reference/Operators_69135a8d5772f8b6e45265523df05d89 tags: - JavaScript - Операторы translation_of: Web/JavaScript/Reference/Operators translation_of_original: Web/JavaScript/Reference/Operators/Comparison_Operators original_slug: Web/JavaScript/Reference/Operators/Операторы_сравнения ---
В JavaScript имеются как строгие сравнения, так и сравнения с преобразованием типа операндов. Строгие сравнения (к примеру, ===) истинны только в том случае, если типы сравниваемых значений являются одинаковыми (к примеру: string-string, number-number). Однако, чаще используются сравнения с преобразованием типов (к примеру, ==). Такой тип сравнения, перед тем как непосредственно выполнить сравнение, приводит операнды к одному типу. В случае же абстрактного реляционного сравнения, операнды сперва преобразуются в примитивы, затем приводятся к одному типу, и только после этого сравниваются.
Строки сравниваются на основе стандартного лексикографического упорядочения, используя значения Unicode.
Особенности сравнений:
истинны (true)
или ложны (false
).null
и undefined
равны себе как в строгом сравнении, так и в абстрактном.При использовании сравнения с преобразованием типов, следует быть крайне осторожным, так как это может привести к непредвиденным проблемам, связанным с особенностями конвертации различных типов (см. параграф "Использование операторов равенства").
Оператор равно сначала приводит операнды к одному типу, и затем применяет строгое сравнение. Если оба операнда являются объектами, то JavaScript сравнивает внутренние ссылки, которые равны в том случае, если они ссылаются на один и тот же объект в памяти.
x == y
1 == 1 // истина "1" == 1 // истина 1 == '1' // истина 3 == 5 // ложь 0 == false // истина "foo" == "bar" // ложь
Оператор не равно возвращает true
в том случае, если операнды не равны.Он аналогичен оператору равенства, перед сравнением приводит операнды к одному типу. В случае если оба операнда являются объектами, JavaScript сравнивает внутренние ссылки, которые не равны в том случае, если относятся к разным объектам в памяти.
x != y
1 != 2 // истина 1 != "1" // ложь 1 != '1' // ложь 1 != true // ложь 0 != false // ложь "foo" != "bar" // истина
Оператор возвращает истину в том случае, если операнды строго равны (см. выше). В отличие от оператора равно, данный оператор не приводит операнды к одному типу.
x === y
3 === 3 // истина 3 === '3' // ложь 'foo' === 'foo' // истина
Оператор строго не равно возвращает истину в том случае, если операнды не равны, или их типы отличаются друг от друга.
x !== y
3 !== '3' // истина 4 !== 3 // истина
Оператор больше возвращает истину в том случае, если значение левого операнда больше, чем правого.
x > y
4 > 3 // истина 1 > 5 // ложь
Оператор больше или равно, возвращает истину в том случае, если значение операнда слева больше или равно значению операнда справа.
x >= y
4 >= 3 // истина 3 >= 3 // истина
Оператор меньше, возвращает истину в том случае, если значение операнда слева меньше, чем значение операнда справа.
x < y
3 < 4 // истина 5 < 2 // ложь
Оператор меньше или равно, возвращает истину в том случае, если значение операнда слева меньше, или равно значению операнда справа.
x <= y
3 <= 4 // истина 3 <= 3 // истина
Стандартные операции равенства с преобразованием типов (==
и !=
) используют Абстрактный Алгоритм Эквивалентного Сравнения для сравнения двух операндов. Если у операндов различные типы, то JavaScript пытается привести их к одному типу, перед тем как сравнивать их. К примеру, в выражении 5 == '5'
, строка справа конвертируется в число, и только потом сравнивается.
Операторы строгого равентсва (===
и !==
) используют Строгий Алгоритм Эквивалентного Сравнения, и предназначены для сравнения операндов одного типа. Если операнды имеют разные типы, то результат операции сравнения всегда будет ложью. К примеру, выражение 5 !== '5'
будет истинным.
Используйте операторы строгого равенства в тех случаях, когда необходимо проверять не только значения операндов, но так же и их типы. Во противном случае, используйте операторы стандартного равенства, которые позволяют сравнить два операнда вне зависимости от их типов.
Когда происходит преобразование типов (т.е в случаях использования нестрогого сравнения), JavaScript преобразует типы String, Number, Boolean и Object, следующим образом:
(Number)
и строки (String)
, JavaScript пытается преобразовать числовой литерал строки в число. Затем полученное число округляется до ближайшего возможного значения типа Number
.(Boolean)
, то он преобразуется в значение типа (Number)
. Если значение логического операнда равняется истине (true)
, то значение этого операнда преобразуется в 1. Иначе - в 0 (ложь / false)
.valueOf()
и toString()
. Если преобразовать объект не удается, генерируется ошибка времени выполнения.// Истина, так как оба операнда имеют тип String 'foo' === 'foo' var a = new String('foo'); var b = new String('foo'); // Ложь, так как операнды являются объектами, внутренние ссылки которых, ссылаются на разные объекты в памяти a == b // Ложь, так как операнды являются объектами, внутренние ссылки которых, ссылаются на разные объекты в памяти a === b // Истина, так как объект a (String) будет преобразован в строку 'foo', перед сопоставлением a == 'foo'
Спецификация | Статус | Комментарий |
---|---|---|
{{SpecName('ES1')}} | {{Spec2('ES1')}} | Появление в спецификации. Выполняется в JavaScript 1.0 |
{{SpecName('ES3')}} | {{Spec2('ES3')}} | Добавлены операторы === и !== . Выполняется в JavaScript 1.3 |
{{SpecName('ES5.1', '#sec-11.8')}} | {{Spec2('ES5.1')}} | Определено в нескольких секциях спецификации: Относительные операторы, Операторы равенства |
{{SpecName('ES6', '#sec-relational-operators')}} | {{Spec2('ES6')}} | Определено в нескольких секциях спецификации: Относительные операторы, Операторы равенства |
{{SpecName('ESDraft', '#sec-relational-operators')}} | {{Spec2('ESDraft')}} | Определено в нескольких секциях спецификации: Относительные операторы, Операторы равенства |
{{CompatibilityTable}}
Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari | |
---|---|---|---|---|---|
Базовая поддержка | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |
{{CompatVersionUnknown}} |
Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | |
---|---|---|---|---|---|---|
Базовая поддержка | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |