var assert = require('assert') function deepEqual(obj1, obj2){ var keys1 = Object.keys(obj1) var keys2 = Object.keys(obj2) if(keys1.length !== keys2.length) return false for(var key in obj1){ if(!obj2.hasOwnProperty(key)) return false else if(typeof obj1[key] !== 'object' && typeof obj2[key] !== 'object'){ if(obj1[key] !== obj2[key]) return false } else if(typeof obj1[key] === 'object' && typeof obj2[key] === 'object'){ if(getType(obj1[key]) !== getType(obj2[key])) return false switch(getType(obj1[key])){ // case '[object Array]': // if(obj1[key].length !== obj2[key].length) return false // for(var i = 0; i < obj1[key].length; i++){ // if(obj1[key][i] !== obj2[key][i]) return false // } // break case '[object Object]': if(!deepEqual(obj1[key], obj2[key])) return false break // case '[object Function]': // //??? // break //...many more } } else return false } return true } function getType(obj){ return Object.prototype.toString.call(obj) } var a = {1: {2: 3}, 4: 5} var b = {1: {2: 3}, 4: 5} var c = {1: {2: {3: 4}}} var d = {1: {2: {3: 4}}} assert.equal(deepEqual(a, b), true) assert.equal(deepEqual(a, c), false) assert.equal(deepEqual(c, d), true) console.log(a === b) console.log(a == b)