Я наткнулся на пример кода, в котором использовалось это сравнение:
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 из спецификации , тогда как ===
использует алгоритм строгого равенства . Примечание об алгоритме строгого равенства указывает на разницу:
Этот алгоритм отличается от алгоритма 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
для ключей и by Array.prototype.includes
).Также существует эквивалентность объектов , которая не обеспечивается самим языком или средой выполнения, но обычно выражается следующим образом: объекты имеют один и тот же прототип, одинаковые свойства, и их значения свойств одинаковы (согласно некоторому разумному определению "одинакового" ).
- Если Тип (x) отличается от Типа (y), вернуть false.
- Если Type (x) - Number, то
- Если x равно NaN, а y равно NaN, вернуть true.
- Если x равен +0, а y равен -0, вернуть false.
- Если x равен -0, а y равен +0, вернуть false.
- Если x имеет то же числовое значение, что и y, вернуть true.
- Вернуть false.
- Верните SameValueNonNumber (x, y).
... где SameValueNonNumber :
- Утверждение: тип (x) не является числом.
- Утверждение: Тип (x) совпадает с Типом (y).
- Если Type (x) не определен, вернуть true.
- Если Type (x) равен Null, вернуть true.
- Если Type (x) равен String, то
- Если x и y являются одной и той же последовательностью кодовых единиц (одинаковой длины и одинаковых кодовых единиц с соответствующими индексами), вернуть true; в противном случае верните false.
- Если Type (x) логический, то
- Если x и y оба истинны или оба ложны, верните true; в противном случае верните false.
- Если Type (x) - Symbol, то
- Если x и y - одно и то же значение символа, верните true; в противном случае верните false.
- Вернуть истину, если x и y - одно и то же значение объекта. В противном случае верните false.
- Если Тип (x) отличается от Типа (y), вернуть false.
- Если Type (x) - Number, то
- Если x равен NaN, вернуть false.
- Если y равно NaN, верните false.
- Если x имеет то же числовое значение, что и y, вернуть true.
- Если x равно +0, а y равно -0, вернуть истину.
- Если x равен -0, а y равен +0, вернуть истину.
- Вернуть false.
- Верните 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;
}
Вышеупомянутая функция 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
то же самое.