===
est appelé opérateur de comparaison strict en JavaScript. Object.is
et l'opérateur de comparaison stricte se comporte exactement de la même manière sauf pour NaN
et +0/-0
.
De MDN:
Object.is()
n'est pas la même chose qu'être égal selon l' ===
opérateur. L' ===
opérateur (et l' ==
opérateur également) traite les valeurs numériques -0 et +0 comme égales et traite Number.NaN
comme non égales à NaN
.
Le code ci-dessous met en évidence la différence entre ===
et 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
Vous pouvez trouver plus d'exemples ici .
Remarque : Object.is
fait partie de la proposition ECMAScript 6 et n'est pas encore largement pris en charge (par exemple, il n'est pris en charge par aucune version d'Internet Explorer ou de nombreuses versions plus anciennes d'autres navigateurs). Cependant, vous pouvez utiliser un polyfill pour les navigateurs non ES6 qui peut être trouvé dans le lien ci-dessus.
.x
sur une chaîne la boxe dans unString
objet (et non une valeur primitive de chaîne) et la comparaison serait entre un objet et une chaîne - c'est très subtile et constitue un piège - la statique évite ces problèmes, les méthodes statiques sont plus simples et plus faciles à utiliser.document.createElement('div').isEqualNode(document.createElement('div')) === true
Object.is
utilise l' algorithme SameValue de la spécification , alors qu'il===
utilise l' algorithme d'égalité stricte . Une note sur l'algorithme d'égalité stricte souligne la différence:Notez que:
NaN === NaN
est faux, maisObject.is(NaN, NaN)
est vrai+0 === -0
est vrai, maisObject.is(+0, -0)
est faux-0 === +0
est vrai, maisObject.is(-0, +0)
est fauxJavaScript a au moins quatre types "d'égalité":
==
), où les opérandes seront forcés d'essayer de les faire correspondre. Les règles sont clairement spécifiées , mais non évidentes. ("" == 0
esttrue
;"true" == true
estfalse
, ...).===
), où les opérandes de types différents ne seront pas forcés (et ne seront pas égaux), mais voir la note ci-dessus surNaN
et zéro positif et négatif.Object.is
).SameValue
sauf+0
et-0
sont identiques au lieu de différents (utilisés parMap
pour les touches et parArray.prototype.includes
).Il y a aussi l' équivalence d'objet , qui n'est pas fournie par le langage ou le runtime lui-même, mais est généralement exprimée comme suit: Les objets ont le même prototype, les mêmes propriétés et leurs valeurs de propriété sont les mêmes (selon une définition raisonnable de «le même» ).
Algorithme SameValue :
... où SameValueNonNumber est:
Algorithme d'égalité stricte :
la source
Ce qui précède est la fonction polyfill pour montrer comment
Object.is
fonctionne, pour tous ceux qui sont intéressés à savoir. Une référence à You-Don't-Know-JSla source
Résumé:
La
Object.is()
fonction prend 2 valeurs comme arguments et renvoie true si les 2 valeurs données sont exactement les mêmes, sinon elle retournera false.Pourquoi avons nous besoin de ça?
Vous pourriez penser que nous avons déjà une égalité stricte (vérifie le type + la valeur) en vérifiant javascript avec l'
===
opérateur, pourquoi avons-nous besoin de cette fonction? Une égalité stricte n'est pas suffisante dans certains cas et ce sont les suivants:Object.is()
nous aide en étant capable de comparer ces valeurs pour voir si elles sont similaires, ce que l'opérateur d'égalité stricte ne peut pas faire.la source
En un mot, ils sont similaires, mais ils sont
Object.is
plus intelligents et plus précis ...Regardons ceci ...
Mais ce n'est pas tout à fait juste car il ignore
-
et+
avant ...Maintenant, nous utilisons:
Comme vous le voyez, c'est plus précis à comparer.
Dans le cas où
NaN
cela fonctionne plus comme correct, considérez tout deNaN
même.la source