Я наткнулся на пример кода, в котором использовалось это сравнение:
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 или многими более старыми версиями других браузеров). Однако вы можете использовать полифилл для браузеров, отличных от ES6, которые можно найти по ссылке, указанной выше.
.x
в строке помещает его вString
объект (а не в строковое примитивное значение), и сравнение будет между объектом и строкой - это очень тонкий и ловушка - статика позволяет избежать этих проблем, статические методы проще и проще в использовании.document.createElement('div').isEqualNode(document.createElement('div')) === true
Object.is
использует алгоритм SameValue из спецификации , тогда как===
использует алгоритм строгого равенства . Примечание об алгоритме строгого равенства указывает на разницу:Обратите внимание, что:
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
для ключей и byArray.prototype.includes
).Также существует эквивалентность объектов , которая не обеспечивается самим языком или средой выполнения, но обычно выражается следующим образом: объекты имеют один и тот же прототип, одинаковые свойства, и их значения свойств одинаковы (согласно некоторому разумному определению "одинакового" ).
Алгоритм SameValue :
... где SameValueNonNumber :
Алгоритм строгого равенства :
источник
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; }
Вышеупомянутая функция polyfill показывает, как
Object.is
работает, для всех, кому интересно знать. Ссылка на You-Don't-Know-JSисточник
Резюме:
Object.is()
Функция принимает 2 значения в качестве аргументов и возвращает истину , если 2 приведены значения точно так же , в противном случае он возвращает ложь.Зачем нам это нужно?
Вы можете подумать, у нас уже есть строгая проверка равенства (проверяет тип + значение) в javascript с
===
оператором, зачем нам эта функция? Ну, строгое равенство в некоторых случаях недостаточно, и они следующие:console.log(NaN === NaN); // false console.log(-0 === +0); // true
Object.is()
помогает нам, имея возможность сравнивать эти значения, чтобы увидеть, похожи ли они, чего не может сделать оператор строгого равенства.console.log(Object.is(NaN, NaN)); // true console.log(Object.is(-0, 0)); // false console.log(Object.is(+0, +0)); // true console.log(Object.is(+0, -0)); // false
источник
В двух словах они похожи, но
Object.is
умнее и точнее ...Посмотрим на это ...
+0 === -0 //true
Но это не совсем верно, так как игнорировал
-
и+
раньше ...Теперь используем:
Object.is(+0, -0) //false
Как видите, это точнее сравнивать.
Также в случае, если
NaN
это работает скорее правильно, так как считайте любоеNaN
то же самое.источник