cloning an object

JavaScript performance comparison

Revision 125 of this test case created by Gwagwa

Preparation code

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

      
<script>
Benchmark.prototype.setup = function() {
  var oldObject = {
     a: 1,
     b: 2,
     c: 3,
     d: 4,
     e: 5,
     f: function() {
      return 6;
     },
     g: [7, 8, 9],
     h: {
       i: 0,
       j: 1
     }
    };
    
  function cloneObj(obj){
      if(obj instanceof Object){
          switch(true){
              case (obj instanceof Array):
                  var ret = [];
                  for(var i=0; i<obj.length; i++) ret.push(cloneObj(obj[i]));
                  return ret;
              case (obj instanceof String):
                  return obj;
              default:
                  var ret = {};
                  for(var k in obj){
                      if(obj.hasOwnProperty(k)) ret[k] = cloneObj(obj[k]);
                  }
              return ret;
          }
      } else {
          return obj;
      }
  }
    
    function clone(obj) {
     var target = {};
     for (var i in obj) {
      if (obj.hasOwnProperty(i)) {
       target[i] = obj[i];
      }
     }
     return target;
    }
  
    function cloneDeep(obj) {
     var target = {};
     for (var i in obj) {
      if (obj.hasOwnProperty(i)) {
       target[i] = jQuery.extend(true, {}, obj[i]);
      }
     }
     return target;
    }
    
    Object.defineProperties(Object, {
     'extend': {
      'configurable': true,
      'enumerable': false,
      'value': function extend(what, wit) {
       var extObj, witKeys = Object.keys(wit);
    
       extObj = Object.keys(what).length ? Object.clone(what) : {};
    
       witKeys.forEach(function(key) {
        Object.defineProperty(extObj, key, Object.getOwnPropertyDescriptor(wit, key));
       });
    
       return extObj;
      },
      'writable': true
     },
     'clone': {
      'configurable': true,
      'enumerable': false,
      'value': function clone(obj) {
       return Object.extend({}, obj);
      },
      'writable': true
     }
    });

};
</script>

Preparation code output

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in CCBot 2.0.0 / Other 0.0.0
Test Ops/sec
jQuery.extend() deep
var newObject = jQuery.extend(true, {}, oldObject);
pending…
JSON stringify/parse
var newObject = JSON.parse(JSON.stringify(oldObject));
pending…
jQuery.extend()
var newObject = jQuery.extend({}, oldObject);
pending…
clone function
var newObject = clone(oldObject);
console.log(newObject == oldObject);
console.log(newObject === oldObject);
pending…
cloneDeep function
var newObject = cloneDeep(oldObject);
pending…
stringify eval
var newObject = eval("("+JSON.stringify(oldObject)+")");
pending…
clone recursive
var newObject = cloneObj(oldObject);
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL.

0 Comments