Comparing and cloning objects in JavaScript

Here’s a handy way to determine if two JavaScript objects are identical without using a framework like jQuery or MooTools:

var compare_objects = function (obj1, obj2) {
  var parameter_name;
  var compare = function (objA, objB, param) {
    var param_objA = objA[param],
      param_objB = typeof objB[param] === "undefined" ? false : objB[param];
    switch (typeof objA[param]) {
      case "object":
        return compare_objects(param_objA, param_objB);
      case "function":
        return param_objA.toString() === param_objB.toString();
      default:
        return param_objA === param_objB;
    }
  };
  for (parameter_name in obj1) {
    if (
      typeof obj2[parameter_name] === "undefined" ||
      !compare(obj1, obj2, parameter_name)
    ) {
      return false;
    }
  }
  for (parameter_name in obj2) {
    if (
      typeof obj1[parameter_name] === "undefined" ||
      !compare(obj1, obj2, parameter_name)
    ) {
      return false;
    }
  }
  return true;
};

Here’s an easy way to clone a JavaScript object:

var clone_object = function (original_obj) {
  var new_obj = {};
  for (var param in original_obj) {
    if (original_obj.hasOwnProperty(param)) {
      if (typeof original_obj[param] === "object") {
        new_obj[param] = clone_object(original_obj[param]);
      } else {
        new_obj[param] = original_obj[param];
      }
    }
  }
  return new_obj;
};

A real-world example of the two functions:

var object_1 = { fruit: "apple", tree: "dogwood", number: 3 };
var object_2 = {
  fruit: "apple",
  tree: "dogwood",
  number: 3,
  cartoons: { anime: "robotech", fantasy: "he-man" },
};
var object_3 = clone_object(object_2);
console.log("objects 1 and 2 match? " + compare_objects(object_1, object_2)); //displays false;  console.log("objects 2 and 3 match? " +compare_objects(object_2, object_3)); //displays true

Bear in mind both of these functions are recursive, which means the larger the object, the slower the performance.