Here is what might work:
function isSame(obj1, obj2, prefer){ // Optional parameter prefer allows to only check for object keys and not both keys and values of an object var obj_prefer = prefer || "both"; function checkArray(arr1, arr2){ for(var i = 0, j = obj1.length; i<j; i++){ if(obj1[i] !== obj2[i]){return false;} } return true; } function checkValues(obj_1, obj_2){ for(var prop in obj_1){ if(typeof obj_1[prop] === "function"){ // converting functions to string so that they can be matched obj_1[prop] = String(obj_1[prop]); obj_2[prop] = String(obj_2[prop]); } if(obj_1[prop] !== obj_2[prop]){ return false;} } return true; } // The built in === will check everything except when typeof object is "object" if ( typeof obj1 === "object"){ // typeof Array is object so this is an alternative if((typeof obj1.push === "function") && (!obj1.hasOwnProperty('push'))){ return checkArray(obj1, obj2); } else{ if( obj_prefer !== "keys"){ // do not check for values if obj_prefer is "keys" return checkValues(obj1, obj2); } var keys_1 = Object.keys(obj1); var keys_2 = Object.keys(obj2); if(!checkArray(keys_1, keys_2)){return false;} return true; } } // I thought undefined === undefined will give false but it isn't so you can remove it if( typeof obj1 === "undefined" && typeof obj2 === "undefined" ){return true} if(typeof obj1 === "function"){ return String(obj1) === String(obj2); } return obj1 === obj2; } console.log(isSame(2, 2)); //true console.log(isSame([1], [1])); // true
Since it converts functions to strings to compare them, check for spaces that might break things:
var func1 = function(){}, func2 = function(){ };
You can check out http://jsfiddle.net/webholik/dwaLN/4/ to try it yourself.
Ankit
source share