cloning an object

JavaScript performance comparison

Revision 143 of this test case created by

Preparation code

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

      
<script>
Benchmark.prototype.setup = function() {
  var oldObject = {
     a: {a:1,b:"",c:123},
     b: {a:2,b:"",c:123},
     c: {a:3,b:"",c:123},
     d: {a:4,b:"",c:123},
     e: {a:5,b:"",c:123},
     f: {a:6,b:"",c:123},
     g: [7, 8, 9]
    };
    
    var jsonObject = JSON.stringify(oldObject);
    function clone(obj) {
     if(obj === null || typeof obj !== 'object')
  return obj;
     var target = obj instanceof Array ? [] : {};
     for (var i in obj) {
       target[i] = clone(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
     }
    });
  
  function isObjInArray(obj, array, func){
            for(var i=0; i<array.length; i++){
              var objPlace = func(array[i]) || array[i];
              if(objPlace === obj)
                return ~i;
            }
            return false;
          }
  
          function customClon(original, circleRefs){
            circleRefs = circleRefs || [];
            var copy;
  
            // undefined, null and all simple type: string, number..
            if (undefined === original || null === original || 'object' !== typeof original) return original;
  
            // Handle Date
            if (original instanceof Date) {
              copy = new Date();
              copy.setTime(original.getTime());
              return copy;
            }
  
            // Handle Object
            if (original instanceof Object) {
              // is a circular ref?
              var isIn = isObjInArray(original, circleRefs, function(el){ return el.original;});
              if(isIn){
                return circleRefs[~isIn].copy;
              }
                
              // array or normal object
              copy = original instanceof Array ? [] : Object.create(original.constructor.prototype);
              circleRefs.push({original: original, copy: copy});
              for (var attr in original) {
                if (original.hasOwnProperty(attr)) copy[attr] = customClon(original[attr], circleRefs);
              }
              return copy;
            }
          }

};
</script>

Preparation code output

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.min.js"></script>

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…
JSON parse
var newObject = JSON.parse(jsonObject);
pending…
clone function
var newObject = clone(oldObject);
pending…
ES5 Object.clone
var newObject = Object.clone(oldObject);
pending…
stringify eval
var newObject = eval("("+JSON.stringify(oldObject)+")");
pending…
customCloneDeep
var newObject = customClon(oldObject)
pending…
lodash cloneDeep
var newObject = _.cloneDeep(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