Object.is()

Object.is() - это метод, который сравнивает два значения и возвращает true, если они считаются одним и тем же значением.

console.log(Object.is(10, 10));
console.log(Object.is('10', 10));

Результат:

true
false

Первое сравнение вернуло true, потому что значения одинаковые. Во втором случае строка ‘10’ и число 10 - это разные значения.

Что такое Object.is()

Object.is() похож на строгое сравнение ===. Метод не преобразует типы и не пытается сделать строку числом.

console.log(Object.is('JavaScript', 'JavaScript'));
console.log(Object.is(true, 1));
console.log(Object.is(null, undefined));

Результат:

true
false
false

Если типы или значения отличаются, метод возвращает false.

Синтаксис

Общая запись выглядит так:

Object.is(value1, value2);

value1 и value2 - значения, которые нужно сравнить.

let result = Object.is(5, 5);

console.log(result);

Результат:

true

Сравнение с ===

В большинстве обычных случаев Object.is() и === дают одинаковый результат.

console.log(Object.is(7, 7));
console.log(7 === 7);

console.log(Object.is('7', 7));
console.log('7' === 7);

Результат:

true
true
false
false

Главные отличия связаны с двумя случаями: NaN и нулем со знаком.

Сравнение NaN

Обычное сравнение считает, что NaN не равен даже самому себе.

console.log(NaN === NaN);
console.log(Object.is(NaN, NaN));

Результат:

false
true

Object.is() в этом месте ведет себя понятнее: если оба значения NaN, метод возвращает true.

Сравнение +0 и -0

В JavaScript есть обычный ноль 0 и отрицательный ноль -0. В большинстве задач между ними нет разницы.

console.log(0 === -0);
console.log(Object.is(0, -0));

Результат:

true
false

Строгое сравнение считает эти значения равными, а Object.is() различает их. На первых уроках такая проверка нужна редко, но важно знать, почему результат может отличаться от ===.

Сравнение объектов

Несмотря на название, Object.is() не сравнивает содержимое объектов. Он проверяет, ссылаются ли переменные на один и тот же объект.

let user = { name: 'Jack' };
let admin = user;
let guest = { name: 'Jack' };

console.log(Object.is(user, admin));
console.log(Object.is(user, guest));

Результат:

true
false

user и admin ссылаются на один объект, поэтому результат true. guest - это другой объект, даже если внутри такие же свойства.

Итого

Object.is() сравнивает два значения без преобразования типов. В обычных случаях он похож на ===, но отличается при сравнении NaN, 0 и -0.

Object.is(value1, value2);

Метод полезен, когда нужно сравнить значения строго и при этом корректно обработать NaN.