Я наткнулся на пример кода, который использовал это сравнение:
var someVar = 0;
Object.is(false, someVar); //Returns false
Я знаю, что false == 0
будет true
, поэтому мы имеем ===
.
Как Object.is
отличается от ===
?
Я наткнулся на пример кода, который использовал это сравнение:
var someVar = 0;
Object.is(false, someVar); //Returns false
Я знаю, что false == 0
будет true
, поэтому мы имеем ===
.
Как Object.is
отличается от ===
?
===
называется оператором строгого сравнения в JavaScript. Object.is
и оператор строгого сравнения ведут себя одинаково, за исключением NaN
и +0/-0
.
Из MDN:
Метод
Object.is()
- это не то же самое, что быть равным согласно оператору===
. Оператор===
(и оператор==
) обрабатывает числовые значения -0 и +0 как равные и обрабатываетNumber.NaN
как не равныеNaN
.
Приведенный ниже код подчеркивает разницу между ===
и Object.is()
.
console.log(+0 === -0); //true
console.log(Object.is(+0, -0)); //false
console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); //true
console.log(Number.NaN === Number.NaN); // false
console.log(Object.is(Number.NaN, Number.NaN)); // true
console.log(NaN === Number.NaN); // false
console.log(Object.is(NaN, Number.NaN)); // true
Вы можете найти больше примеров здесь.
Примечание: Object.is
является частью предложения ECMAScript 6 и пока широко не поддерживается (например, не поддерживается ни одной версией Internet Explorer или многими более старыми версиями других браузеров). Однако вы можете использовать polyfill для браузеров не-ES6, которые можно найти по ссылке, приведенной выше.
Object.is
использует спецификационный алгоритм SameValue, тогда как ===
использует алгоритм строгого равенства. Примечание об алгоритме строгого равенства выявляет разницу:
Этот алгоритм отличается от алгоритма SameValue... обработкой подписанных нулей и NaN.
Обратите внимание, что:
NaN === NaN
ложно, но Object.is(NaN, NaN)
верно+0 === -0
верно, но Object.is(+0, -0)
неверно-0 === +0
верно, но Object.is(-0, +0)
неверноВ JavaScript есть как минимум четыре вида "равенства":
==
), где операнды будут принудительно пытаться сопоставить их. Правила четко указаны, но неочевидны. ("" == 0
это true
; "true" == true
это false
,...).===
), где операнды разных типов не будут принудительно (и не будут равны), но см. Примечание выше о NaN
и положительном и отрицательном нуле.Object.is
).SameValue
за исключением того, что +0
и -0
являются одинаковыми, а не разными (используются Map
для ключей и Array.prototype.includes
).Также существует эквивалентность объекта, которая не обеспечивается самим языком или средой выполнения, но обычно выражается следующим образом: объекты имеют один и тот же прототип, одинаковые свойства и значения их свойств одинаковы (по некоторым разумным определениям "то же самое")).
- Если Type (x) отличается от Type (y), вернуть false.
- Если тип (х) является число, то
- Если x равен NaN, а y равен NaN, вернуть true.
- Если x равен +0, а y равен -0, вернуть false.
- Если x равен -0, а y равен +0, вернуть false.
- Если x - это то же самое числовое значение, что и y, вернуть true.
- Вернуть ложь.
- Вернуть SameValueNonNumber (x, y).
... где SameValueNonNumber:
- Утверждение: Тип (x) не является Number.
- Утверждение: тип (x) совпадает с типом (y).
- Если Тип (x) не определен, вернуть true.
- Если Type (x) равен Null, вернуть true.
- Если Тип (x) является Строкой, тогда
- Если x и y - это одна и та же последовательность единиц кода (одинаковая длина и одинаковые единицы кода при соответствующих индексах), верните true; в противном случае верните false.
- Если тип (x) является логическим, то
- Если x и y оба имеют значение true или оба false, вернуть true; в противном случае верните false.
- Если Тип (x) является Символом, тогда
- Если x и y оба являются одним и тем же значением Symbol, верните true; в противном случае верните false.
- Вернуть true, если x и y - это одно и то же значение объекта. В противном случае верните false.
- Если Type (x) отличается от Type (y), вернуть false.
- Если тип (х) является число, то
- Если x равен NaN, вернуть false.
- Если y равен NaN, вернуть false.
- Если x - это то же самое числовое значение, что и y, вернуть true.
- Если x равен +0, а y равен -0, верните true.
- Если x равен -0, а y равен +0, верните true.
- Вернуть ложь.
- Вернуть SameValueNonNumber (x, y).
Object.is = function(v1, v2){
//test for '-0'
if(v1 === 0 && v2 === 0) {
return 1 / v1 === 1 / v2;
}
//test for 'NaN'
if(v1 !== v1) {
return v2 !== v2;
}
//everything else
return v1 === v2;
}
Функция Object.is()
принимает 2 значения в качестве аргументов и возвращает истину, если 2 заданных значения в точности совпадают, в противном случае она вернет ложь.
Вы можете подумать, у нас уже есть строгое равенство (проверяет тип + значение), проверяющее в javascript с помощью оператора ===
, зачем нам эта функция? Ну, строгое равенство не достаточно в некоторых случаях, и они следующие:
console.log(NaN === NaN); // false
console.log(-0 === +0); // true