Cloning an Object (v77)

Revision 77 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.7.2.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;
  }

var RefuelClone = function(obj) {
                if(obj === null || typeof(obj) !== 'object'){
                        return obj;
                }
                
                var temp = obj.constructor(); // changed
                
                for(var key in obj){
                        temp[key] = RefuelClone(obj[key]);
                }
                return temp;
        }
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
JQuery.extend deep
var newObject = jQuery.extend(true, {}, oldObject);
ready
JSON
var newObject = JSON.parse(JSON.stringify(oldObject));
ready
JQuery.extend
var newObject = jQuery.extend({}, oldObject);
ready
simple clone function
var newObject = clone(oldObject);
ready
native deep copy with constructor
var newObject = RefuelClone(oldObject)
ready
filter - Object
var newObject = oldObject.filter(Object)
ready
filter - True
var newObject = oldObject.filter(function(){ return true })
ready

Revisions

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