Pourquoi deux objets identiques ne sont-ils pas égaux les uns aux autres?

On dirait que le code suivant devrait renvoyer un vrai, mais il renvoie faux.

var a = {}; var b = {}; console.log(a==b); //returns false console.log(a===b); //returns false 

Comment ça peut vouloir dire quelque chose?

La seule différence entre l'égalité régulière ( == ) et l'égalité stricte ( === ) est que l'opérateur d'égalité stricte désactive la conversion de type. Puisque vous comparez déjà deux variables du même type, le type d'opérateur d'égalité que vous utilisez n'a pas d'importance.

Indépendamment de savoir si vous utilisez une égalité régulière ou stricte, les comparaisons d'objets ne sont évaluées qu'à true si vous comparez le même objet exact .

C'est-à-dire, étant donné var a = {}, b = a, c = {}; , A a == a , a == b , mais a != c

Deux objets différents (même s'ils ont tous deux des propriétés exactes ou nulles) ne seront jamais comparés à parts égales. Si vous devez comparer l'égalité des deux propriétés de l'objet, cette question a des réponses utiles .

Comment ça peut vouloir dire quelque chose?

Étant donné que l'égalité des références d'objet, en termes d'opérateurs == et === , repose uniquement sur le fait que les références se réfèrent au même objet. Ceci est clairement défini dans l'algorithme de comparaison d'égalité abstraite (utilisé par == ) et l' algorithme de comparaison d'égalité stricte (utilisé par === ).

Dans votre code, lorsque vous dites a==b ou a===b , vous ne comparez pas les objets , vous comparez les références dans a et b pour voir si elles se réfèrent au même objet. C'est la façon dont JavaScript est défini, et en fonction de la façon dont les opérateurs d'égalité dans plusieurs (mais pas tous) d'autres langues sont définis (Java, C # [à moins que l'opérateur ne soit remplacé, comme il appartient à string ] et C ++ par exemple).

JavaScript n'a pas de concept intégré d' équivalence , une comparaison entre des objets qui indiquent s'ils sont équivalents (par exemple, ont les mêmes propriétés avec les mêmes valeurs, comme le Object#equals de Java est Object#equals ). Vous pouvez définir l'un dans votre propre base de code, mais il n'y a rien d'intrinsèque qui le définisse.

=== , l'opérateur strictement égal pour les objets vérifie l'identité.

Deux objets sont strictement égaux s'ils se réfèrent au même Objet.

Ce sont deux objets différents, donc ils diffèrent.

Pensez à deux pages de papier vides. Leurs attributs sont les mêmes, mais ils ne sont pas la même chose. Si vous écrivez quelque chose sur l'un d'eux, l'autre ne changera pas.

À partir du Guide définitif de Javascript.

Les objets ne sont pas comparés par valeur: deux objets ne sont pas égaux même s'ils ont les mêmes propriétés et valeurs. Cela vaut également pour les tableaux: même s'ils ont les mêmes valeurs dans le même ordre.

 var o = {x:1}, p = {x:1}; // Two objects with the same properties o === p // => false: distinct objects are never equal var a = [], b = []; // Two distinct, empty arrays a === b // => false: distinct arrays are never equal 
 use JSON.stringify(objname); var a = {name : "name1"}; var b = {name : "name1"}; var c = JSON.stringify(a); var d = JSON.stringify(b); c==d; //true 

Il s'agit d'une solution de contournement: Object.toJSON(obj1) == Object.toJSON(obj2)

En se transformant en chaîne, la destination sera en strings