Равенство (==)
Базовый уровень Широко доступно
Эта возможность хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Оператор **равенства (==)** проверяет, равны ли два его операнда, возвращая логический результат. В отличие от оператора строгого равенства, он пытается преобразовать и сравнить операнды, имеющие разные типы.
Попробуйте
console.log(1 == 1);
// Expected output: true
console.log("hello" == "hello");
// Expected output: true
console.log("1" == 1);
// Expected output: true
console.log(0 == false);
// Expected output: true
Синтаксис
x == y
Описание
Операторы равенства (== и !=) предоставляют семантику IsLooselyEqual (нестрогое равенство). Это можно кратко изложить следующим образом:
- Если операнды имеют одинаковый тип, они сравниваются следующим образом:
- Object: возвращается
true, только если оба операнда ссылаются на один и тот же объект. - String: возвращается
true, только если оба операнда имеют одинаковые символы в том же порядке. - Number: возвращается
true, только если оба операнда имеют одинаковое значение.+0и-0считаются одинаковыми значениями. Если любой операнд равенNaN, возвращаетсяfalse; таким образом,NaNникогда не равенNaN. - Boolean: возвращается
true, только если оба операнда являютсяtrueили оба являютсяfalse. - BigInt: возвращается
true, только если оба операнда имеют одинаковое значение. - Symbol: возвращается
true, только если оба операнда ссылаются на один и тот же символ.
- Object: возвращается
- Если один из операндов равен
nullилиundefined, другой также должен бытьnullилиundefined, чтобы вернутьtrue. В противном случае возвращаетсяfalse. - Если один из операндов является объектом, а другой — примитивным значением, преобразуйте объект в примитив.
- На этом шаге оба операнда преобразуются в примитивы (один из String, Number, Boolean, Symbol и BigInt). Остальная часть преобразования выполняется индивидуально:
- Если они имеют одинаковый тип, сравните их, используя шаг 1.
- Если один из операндов является Symbol, а другой — нет, возвращается
false. - Если один из операндов является Boolean, а другой — нет, преобразуйте логическое значение в число:
trueпреобразуется в 1, аfalseпреобразуется в 0. Затем снова сравните два операнда нестрого. - Number в String: преобразуйте строку в число. Сбой преобразования приводит к
NaN, что гарантирует, что равенство будетfalse. - Number в BigInt: сравнение по их математическому значению. Если число равно ±Infinity или
NaN, возвращаетсяfalse. - String в BigInt: преобразуйте строку в BigInt, используя тот же алгоритм, что и конструктор
BigInt(). Если преобразование не удастся, возвращаетсяfalse.
Нестрогое равенство симметрично: A == B всегда имеет идентичную семантику с B == A для любых значений A и B (за исключением порядка примененных преобразований).
Наиболее заметное различие между этим оператором и оператором строгого равенства (===) заключается в том, что оператор строгого равенства не пытается выполнять преобразование типов. Вместо этого оператор строгого равенства всегда считает операнды разных типов неравными. По сути, оператор строгого равенства выполняет только шаг 1, а затем возвращает false для всех остальных случаев.
Существует «умышленное нарушение» вышеуказанного алгоритма: если один из операндов равен document.all, он рассматривается как undefined. Это означает, что document.all == null является true, но document.all === undefined || document.all === null является false.
Примеры
Сравнение без преобразования типов
1 == 1; // true "hello" == "hello"; // true
Сравнение с преобразованием типов
"1" == 1; // true 1 == "1"; // true 0 == false; // true 0 == null; // false 0 == undefined; // false 0 == !!null; // true, look at Logical NOT operator 0 == !!undefined; // true, look at Logical NOT operator null == undefined; // true const number1 = new Number(3); const number2 = new Number(3); number1 == 3; // true number1 == number2; // false
Сравнение объектов
const object1 = {
key: "value",
};
const object2 = {
key: "value",
};
console.log(object1 == object2); // false
console.log(object1 == object1); // true
Сравнение строк и объектов String
Обратите внимание, что строки, созданные с помощью new String(), являются объектами. Если вы сравните один из них со строковым литералом, объект String будет преобразован в строковый литерал, и содержимое будет сравниваться. Однако, если оба операнда являются объектами String, то они сравниваются как объекты и должны ссылаться на один и тот же объект, чтобы сравнение было успешным:
const string1 = "hello";
const string2 = String("hello");
const string3 = new String("hello");
const string4 = new String("hello");
console.log(string1 == string2); // true
console.log(string1 == string3); // true
console.log(string2 == string3); // true
console.log(string3 == string4); // false
console.log(string4 == string4); // true
Сравнение дат и строк
const d = new Date("1995-12-17T03:24:00");
const s = d.toString(); // for example: "Sun Dec 17 1995 03:24:00 GMT-0800 (Pacific Standard Time)"
console.log(d == s); // true
Сравнение массивов и строк
const a = [1, 2, 3]; const b = "1,2,3"; a == b; // true, `a` converts to string const c = [true, 0.5, "hey"]; const d = c.toString(); // "true,0.5,hey" c == d; // true
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
equality |
1 |
12 |
1 |
3 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
Смотрите также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Equality