Рівність (==)

Оператор рівності (==) перевіряє, чи два операнди рівні, повертаючи результат типу Boolean. На відміну від оператору строгої рівності, він намагається перетворити для порівняння операнди, які належать до різних типів.

Синтаксис

x == y

Опис

Оператори рівності (== та !=) використовують алгоритм абстрактної рівності для порівняння двох операндів. Його можна загалом описати наступним чином:

  • Якщо обидва операнди є об'єктами, повертати true тільки якщо обидва операнди посилаються на той самий об'єкт.
  • Якщо один операнд дорівнює null, а інший undefined, повертати true.
  • Якщо операнди належать до різних типів, спробувати привести їх до одного типу перед порівнянням:
    • При порівнянні числа з рядком спробувати перетворити рядок у числове значення.
    • Якщо один з операндів є типом Boolean, перетворити операнд Boolean на 1, якщо він дорівнює true, і на +0, якщо він дорівнює false.
    • Якщо один з операндів є об'єктом, а інший числом або рядком, спробувати перетворити об'єкт на примітив за допомогою методів об'єкта valueOf() та toString().
  • Якщо операнди належать до одного типу, вони порівнюються наступним чином:
    • String: повернути true тільки якщо обидва операнди мають однакові символи у однаковому порядку.
    • Number: повернути true тільки якщо обидва операнди мають однакове значення. +0 та -0 вважаються однаковим значенням. Якщо будь-який з операндів є NaN, повернути false.
    • Boolean: повернути true тільки якщо обидва операнди дорівнюють true або обидва дорівнюють false.

Найбільш помітна відмінність між цим оператором та оператором строгої рівності (===) полягає в тому, що оператор строгої рівності не намагається виконувати перетворення типів. Натомість, оператор строгої рівності завжди вважає операнди різних типів різними.

Приклади

Порівняння без перетворення типів

1 == 1;              // true
"привіт" == "привіт";  // true

Порівняння з перетворенням типів

"1" ==  1;            // true
1 == "1";             // true
0 == false;           // true
0 == null;            // false
0 == undefined;       // false
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"};

object1 == object2 // false
object2 == object2 // true

Порівняння рядків та об'єктів String

Зауважте, що рядки, створені за допомогою new String(), є об'єктами. Якщо ви порівняєте один з них з рядковим літералом, об'єкт String буде перетворений на рядковий літерал, і їхній вміст буде порівнюватись. Однак, якщо обидва операнди є об'єктами String, вони порівнюються як об'єкти та мусять посилатись на один і той самий об'єкт, щоб вважатись однаковими:

const string1 = "привіт";
const string2 = String("привіт");
const string3 = new String("привіт");
const string4 = new String("привіт");

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('December 17, 1995 03:24:00');
const s = d.toString(); // наприклад: "Sun Dec 17 1995 03:24:00 GMT-0800 (Pacific Standard Time)"
console.log(d == s);    //true

Специфікації

Специфікація
ECMAScript (ECMA-262)
The definition of 'Equality operators' in that specification.

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
Equality (a == b)Chrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 3Opera Full support 3Safari Full support 1WebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support 10.1Safari iOS Full support 1Samsung Internet Android Full support 1.0nodejs Full support 0.1.100

Legend

Full support  
Full support

Див. також