cloning an object

JavaScript performance comparison

Revision 140 of this test case created by

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]
  };
  
  
  function clone(obj) {
    var target = {};
    for (var i in obj) {
      if (obj.hasOwnProperty(i)) {
        target[i] = 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
    }
  });
  
  var objectPrototype = Object.prototype,
    toString = objectPrototype.toString,
    enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable',
      'toLocaleString', 'toString', 'constructor'
    ];
  
  function ExtJsClone(item) {
    var type,
      i,
      j,
      k,
      clone,
      key;
  
    if (item === null || item === undefined) {
      return item;
    }
  
    if (item.nodeType && item.cloneNode) {
      return item.cloneNode(true);
    }
  
    type = toString.call(item);
  
    if (type === '[object Date]') {
      return new Date(item.getTime());
    }
  
  
  
    if (type === '[object Array]') {
      i = item.length;
  
      clone = [];
  
      while (i--) {
        clone[i] = ExtJsClone(item[i]);
      }
    } else if (type === '[object Object]' && item.constructor === Object) {
      clone = {};
  
      for (key in item) {
        clone[key] = ExtJsClone(item[key]);
      }
  
      if (enumerables) {
        for (j = enumerables.length; j--;) {
          k = enumerables[j];
          clone[k] = item[k];
        }
      }
    }
  
    return clone || item;
  }

};
</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);
pending…
ES5 Object.clone
var newObject = Object.clone(oldObject);
pending…
stringify eval
var newObject = eval("(" + JSON.stringify(oldObject) + ")");
pending…
ExtJsClone
var newObject = ExtJsClone(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