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

Оператор рівності (==) перевіряє, чи два операнди рівні, повертаючи результат типу 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.

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

BCD tables only load in the browser

Див. також