Object.is() сравнивает два значения и возвращает true или false.
На первый взгляд он похож на ===, но работает чуть точнее в двух особых случаях:
NaN+0и-0
Синтаксис
Object.is(value1, value2)
Метод принимает два значения и возвращает результат сравнения.
Что делает Object.is()
Если значения считаются одинаковыми, метод вернёт true.
console.log(Object.is(10, 10)); // true
console.log(Object.is("js", "js")); // true
console.log(Object.is(true, true)); // true
console.log(Object.is(10, 20)); // false
Что возвращает Object.is()
Object.is() всегда возвращает булево значение:
true, если значения считаются одинаковымиfalse, если значения разные
console.log(Object.is("a", "a")); // true
console.log(Object.is("a", "b")); // false
Object.is() и ===
В большинстве обычных случаев результат у Object.is() и === будет одинаковым.
console.log(Object.is(5, 5)); // true
console.log(5 === 5); // true
console.log(Object.is("a", "b")); // false
console.log("a" === "b"); // false
Но есть два важных исключения.
NaN и Object.is()
Через === значение NaN не равно даже самому себе:
console.log(NaN === NaN); // false
А вот Object.is() считает их одинаковыми:
console.log(Object.is(NaN, NaN)); // true
Это один из главных случаев, ради которых и вспоминают этот метод.
+0 и -0
Через === значения +0 и -0 считаются равными:
console.log(+0 === -0); // true
А Object.is() различает их:
console.log(Object.is(+0, -0)); // false
console.log(Object.is(0, -0)); // false
console.log(Object.is(0, 0)); // true
Это второй важный нюанс метода.
С объектами сравнение по ссылке
Object.is() не делает глубокого сравнения объектов.
Он, как и ===, сравнивает ссылки.
const a = { name: "Anna" };
const b = { name: "Anna" };
const c = a;
console.log(Object.is(a, b)); // false
console.log(Object.is(a, c)); // true
На вид a и b одинаковые, но это разные объекты в памяти.
С массивами то же самое
Для массивов правило такое же: сравнивается ссылка, а не содержимое.
console.log(Object.is([1, 2], [1, 2])); // false
const arr = [1, 2];
console.log(Object.is(arr, arr)); // true
Object.is() и ==
== делает неявные преобразования типов.
Object.is() никаких таких преобразований не делает.
console.log(1 == "1"); // true
console.log(Object.is(1, "1")); // false
Поэтому Object.is() намного строже и предсказуемее.
Когда это полезно
Object.is() удобно использовать, когда:
- нужно корректно сравнить
NaN - важно отличать
+0и-0 - нужен более точный вариант сравнения, чем
===
Пример:
const value = NaN;
if (Object.is(value, NaN)) {
console.log("Это NaN");
}
Когда обычного === достаточно
В большинстве бытовых проверок обычного === вполне хватает.
console.log(userId === 10);
Поэтому Object.is() нужен не везде, а в более точных и специальных случаях.
Object.is() не меняет значения
Метод ничего не изменяет и просто возвращает результат сравнения.
const a = 1;
const b = 1;
console.log(Object.is(a, b)); // true
console.log(a); // 1
console.log(b); // 1
Частые ошибки
Думать, что Object.is() делает глубокую проверку объектов
console.log(Object.is({ a: 1 }, { a: 1 })); // false
Метод сравнивает ссылки, а не структуру объекта.
Считать, что Object.is() полностью совпадает с ===
console.log(Object.is(NaN, NaN)); // true
console.log(NaN === NaN); // false
На NaN и +0 / -0 результаты отличаются.
Использовать Object.is() там, где нужен == с приведением типов
console.log(Object.is(1, "1")); // false
Метод не приводит типы автоматически.
Быстрая памятка
Object.is()сравнивает два значения и возвращаетtrueилиfalse- в большинстве случаев он похож на
=== Object.is(NaN, NaN)даётtrueObject.is(+0, -0)даётfalse- объекты и массивы сравниваются по ссылке
Коротко
Object.is() - это более точный способ сравнить два значения в JavaScript. Главное, что стоит запомнить: он почти как ===, но правильно отличает NaN и +0 / -0.