Object.is()

Сводка

Метод Object.is() определяет, являются ли два значения одинаковыми значениями (en-US).

Синтаксис

var isSame = Object.is(value1, value2);

Параметры

value1

Первое сравниваемое значение.

value2

Второе сравниваемое значение.

Описание

Метод Object.is() определяет, являются ли два значения одинаковыми значениями (en-US). Два значения являются одинаковыми в следующих случаях:

  • оба равны undefined
  • оба равны null
  • оба равны true, либо оба равны false
  • оба являются строками с одинаковой длиной и одинаковыми символами
  • оба являются одним и тем же объектом
  • оба являются числами и
    • оба равны +0
    • оба равны -0
    • оба равны NaN
    • либо оба не равны нулю или NaN и оба имеют одинаковое значение

Поведение этого метода не аналогично оператору == (en-US). Оператор == (en-US) использует приведение типов обоих операндов (если они имеют различный тип) перед проверкой на равенство (в результате получается, что проверка "" == false даёт true), а метод Object.is приведение типов не выполняет.

Поведение этого метода не аналогично оператору === (en-US). Оператор === (en-US) (также как и оператор == (en-US)) считает числовые значения -0 и +0 равными, а значение Number.NaN не равным самому себе.

Примеры

js
Object.is("foo", "foo"); // true
Object.is(window, window); // true

Object.is("foo", "bar"); // false
Object.is([], []); // false

var test = { a: 1 };
Object.is(test, test); // true

Object.is(null, null); // true

// Специальные случаи
Object.is(0, -0); // false
Object.is(-0, -0); // true
Object.is(NaN, 0 / 0); // true

Полифил

Метод Object.is предложен в дополнение к стандарту ECMA-262; поэтому он может быть недоступен в некоторых браузерах. Это можно обойти, вставив приведённый ниже фрагмент кода в начало ваших скриптов. Он позволит вам использовать метод Object.is в случаях, когда он не имеет родной поддержки браузером.

if (!Object.is) {
  Object.is = function(x, y) {
    // SameValue algorithm
    if (x === y) { // Steps 1-5, 7-10
      // Steps 6.b-6.e: +0 != -0
      return x !== 0 || 1 / x === 1 / y;
    } else {
      // Step 6.a: NaN == NaN
      return x !== x && y !== y;
    }
  };
}

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

Specification
ECMAScript Language Specification
# sec-object.is

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также