A strict equality operator will tell you if two object types are equal. However, is there a way to tell if two objects are equal, much like the hash code value in Java?
Stack Overflow question Is there any kind of hashCode function in JavaScript? is similar to this question, but requires a more academic answer. The scenario above demonstrates why it would be necessary to have one, and I'm wondering if there is any equivalent solution.
Simplest and logical solutions for comparing everything Like Object, Array, String, Int...
JSON.stringify({a: val1}) === JSON.stringify({a: val2})
Note:
val1
andval2
with your ObjectIf you are working in AngularJS, the
angular.equals
function will determine if two objects are equal. In Ember.js useisEqual
.angular.equals
- See the docs or source for more on this method. It does a deep compare on arrays too.isEqual
- See the docs or source for more on this method. It does not do a deep compare on arrays.If you are using a JSON library, you can encode each object as JSON, then compare the resulting strings for equality.
NOTE: While this answer will work in many cases, as several people have pointed out in the comments it's problematic for a variety of reasons. In pretty much all cases you'll want to find a more robust solution.
If you're using ES6+ via Babel or otherwise, you can also use
Object.is(x, y)
.Reference: http://wiki.ecmascript.org/doku.php?id=harmony:egal#object.is_x_y
Short functional
deepEqual
implementation:Edit: version 2, using jib's suggestion and ES6 arrow functions:
The short answer
The simple answer is: No, there is no generic means to determine that an object is equal to another in the sense you mean. The exception is when you are strictly thinking of an object being typeless.
The long answer
The concept is that of an Equals method that compares two different instances of an object to indicate whether they are equal at a value level. However, it is up to the specific type to define how an
Equals
method should be implemented. An iterative comparison of attributes that have primitive values may not be enough, there may well be attributes which are not to be considered part of the object value. For example,In this above case,
c
is not really important to determine whether any two instances of MyClass are equal, onlya
andb
are important. In some casesc
might vary between instances and yet not be significant during comparison.Note this issue applies when members may themselves also be instances of a type and these each would all be required to have a means of determining equality.
Further complicating things is that in JavaScript the distinction between data and method is blurred.
An object may reference a method that is to be called as an event handler, and this would likely not be considered part of its 'value state'. Whereas another object may well be assigned a function that performs an important calculation and thereby makes this instance different from others simply because it references a different function.
What about an object that has one of its existing prototype methods overridden by another function? Could it still be considered equal to another instance that it otherwise identical? That question can only be answered in each specific case for each type.
As stated earlier, the exception would be a strictly typeless object. In which case the only sensible choice is an iterative and recursive comparison of each member. Even then one has to ask what is the 'value' of a function?