Cloning an Object

JavaScript performance comparison

Revision 2 of this test case created by Corban Brook


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="" type="text/javascript"></script>

  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);
var newObject = JSON.parse(JSON.stringify(oldObject));
var newObject = jQuery.extend({}, oldObject);
simple clone function
var newObject = clone(oldObject);
ES5 Object.clone
var newObject = Object.clone(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:


sissi commented :

Thanks this is really helpful :-)

Cloner commented :

It's worth noting that the output of many of these functions is different:

  • jQuery shallow, simple clone: both are shallow copies; simple clone keeps references to objects, arrays or functions within the object, so the "clone" is still linked to the original object.
  • JSON: loses functions etc
  • jQuery deep, ES5: deep clones

You may be able to use a simple clone in some cases, but the example object being cloned here will not be a proper clone except for in two of the cases.

Jason Miller commented :

Also worth noting: The object used in this test is not in dictionary mode. If you are cloning objects with many properties, the performance degrades drastically.

a commented :


Add a comment