cloning an object

JavaScript performance comparison

Revision 2 of this test case created by usr


There is no quick and easy facility for cloning an object, Some people recommend using JQuery.extend others JSON.parse/stringify

If you want the fastest possible clone function. I would personally anticipate the data structure of your object and write a custom clone to handle it.

Preparation code

<script src="//"></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

Preparation code output

Test runner

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

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
jQuery.extend() deep
var newObject = jQuery.extend(true, {}, oldObject);
JSON stringify/parse
var newObject = JSON.parse(JSON.stringify(oldObject));
var newObject = jQuery.extend({}, oldObject);
clone function
var newObject = clone(oldObject);
ES5 Object.clone
var newObject = Object.clone(oldObject);
stringify eval
var newObject = eval("("+JSON.stringify(oldObject)+")");

Compare results of other browsers


You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:

1 comment

Greg Baker commented :

This method fails to "copy" the array, but instead copies a reference to it. If the value is of type "array" use concat to copy it. Also, if the value is a Object, recursively clone it as well.

// Pollyfil if required \ !Array.isArray && (Array.isArray = function(arg) { return === '[object Array]'; });

// ...then, in the 'witKeys.forEach' loop, add ... var descriptor = Object.getOwnPropertyDescriptor(wit, key); var value = descriptor.value; if ( Array.isArray(value) ) { descriptor.value = [].concat(value); } else if ( typeof value === "object" ) { descriptor.value = Object.clone(value); } ...

Other issues are well documented at StackOverflow, but this fixed my problems.

Add a comment