Cloning an Object (v117)

Revision 117 of this benchmark created on


Description

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

http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-a-javascript-object

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 HTML

<script src="http://code.jquery.com/jquery-1.5.1.js" type="text/javascript"></script>


<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;
  }

    function cloneOwnProps(obj) {
        var copy = {};
        var props = Object.getOwnPropertyNames(obj);
        for (var prop in props) {
            copy[prop] = obj[prop];
        }
        return copy;
    }

    function safeClone(obj) {
        var copy = {};

        if (Object.getOwnPropertyNames) {
            var props = Object.getOwnPropertyNames(obj);
            for (var prop in props) {
                copy[prop] = obj[prop];
            }
        } else {
            for (var prop in obj) {
                if (obj.hasOwnProperty(prop)) {
                    copy[prop] = obj[prop];
                }
            }
        }

        return copy;
    };
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
browser safe clone
var newObject = safeClone(oldObject);
ready
JSON
var newObject = JSON.parse(JSON.stringify(oldObject));
ready
simple clone with own properties
var newObject = cloneOwnProps(oldObject);
ready
simple clone function
var newObject = clone(oldObject);
ready
Manual
var newObject = {
 a: oldObject.a,
 b: oldObject.b,
 c: oldObject.c,
 d: oldObject.d,
 e: oldObject.e,
 f: oldObject.f,
 g: [oldObject.g[0], oldObject.g[1], oldObject.g[2]]
};
ready

Revisions

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