JS deepClone fn

A function to make a deep clone of an object instead of creating references/pointers to original object's depts.

by JakobJingleheimer

HTML

<div id="orig"></div>

<div id="clone"></div>

CSS

body {
    color: #333;
    font: 14px/24px Georgia, serif;
    letter-spacing: 0.1em;
    padding: 1em 0.5em;
}

div {
    border-bottom: 1px dotted #ccc;
    margin-bottom: 1em;
    padding-bottom: 1em;
}
div:last-of-type {
    border-bottom:none;
    margin-bottom:0;
    padding-bottom:0;
}

JavaScript

function deepCopy(obj)
{  
  this.cloneArr = function (arr)
  {
    var newArr = [];
    for ( var i = arr.length-1; i >= 0; i-- )
      { newArr[i] = this.evalObj( arr[i] ); }
    return newArr;
  };
  this.cloneObj = function(obj)
  {
    var newObj = {};
    for ( var prop in obj )
      { newObj[prop] = this.evalObj( obj[prop] ); }
    return newObj;
  };
  this.evalObj = function(obj)
  {
    switch ( typeof obj )
    {
      case 'object':
        if ( Array.isArray( obj ) )
          { return this.cloneArr( obj ); }
        if ( obj instanceof Date === false )
          { return this.cloneObj( obj ); }
        // pass thru dates, strings, numbers, booleans, and functions
      default:
        return obj; // primitive
    }
  };
  return this.evalObj(obj);
}

var foo = {
  "bar": [ { "owth": 1 } ],
  "baz": { "first": 2 },
  "qux": "a",
  "date": new Date
};
console.log('foo: ', foo);
document.getElementById("orig").innerHTML = JSON.stringify(foo);

var FOO = deepCopy( foo );
console.log('FOO: ', FOO);
document.getElementById("clone").innerHTML = JSON.stringify(FOO);