A. Preface:
We usually use “==” or “===” to compare variables in JavaScript. But sometimes, the result maybe not as expected. Let’s take a look:
We have class Employee:
function Employee(EmpID, Name, Birthday, Supervisor) { this.EmpID = EmpID; this.Name = Name; this.Birthday = Birthday; this.Supervisor = Supervisor; this.Age = function () { return new Date().getFullYear() - Birthday; } }
Â
And some instances of this class:
var Supervisor = new Employee(0, "Marry", 1979); var Employee1 = new Employee(1, "John", 1980, Supervisor); var Employee2 = Employee1; var Employee3 = new Employee(1, "John", 1980, Supervisor);
Â
Suppose we want to Employee1  and Employee3  are equal. We can’t use “==” operator or “===” operator.
alert(Employee1 == Employee2); // true. Employee1 and Employee2 are reference to ONE object in memory. alert(Employee1 == Employee3); // false
Â
B. Equal method:
So we’ll define new method to compare object.
function equals(firstObject, secondObject) { var property; //Check if current object's property doesn't exist in the second one. for (property in firstObject) { if (typeof (secondObject[property]) == 'undefined' && typeof (firstObject[property]) != 'undefined') { return false; } } //Check if second object's property doesn't exist in the current one. for (property in secondObject) { if (typeof (firstObject[property]) == 'undefined' && typeof (secondObject[property]) != 'undefined') { return false; } } //Compare properties value in two object for (property in firstObject) { { switch (typeof (firstObject[property])) { case 'object': //If property is object then call method equals to compare if (!equals(firstObject[property], secondObject[property])) { return false; } break; case 'function': //If property is function then compare content in function if (firstObject[property].toString() != secondObject[property].toString()) return false; break; default: //Compare value of property if (typeof (firstObject[property]) != typeof (secondObject[property]) || firstObject[property] != secondObject[property]) return false; } } } return true; }
Â
C. Try it
var Supervisor = new Employee(0, "Marry", 1979); var Employee1 = new Employee(1, "John", 1980, Supervisor); var Employee2 = Employee1; var Employee3 = new Employee(1, "John", 1980, Supervisor); alert(Employee1 == Employee2); // true alert(Employee1 == Employee3); // false alert(equals(Employee1, Employee3)); // true
Â