really deep clones

by rwaldron

HTML

<script src="https://raw.github.com/gist/1009387/clone.js"></script>
<script src="https://raw.github.com/gist/1115701/console.assert.js"></script>
<!--
Testing: https://gist.github.com/1009387

Resource: https://gist.github.com/1115701

-->

JavaScript

var orig = {
      foo: "bar",
      inner: {
        prop: false,
        array: [ 1, 2, 3, 4, 5 ]
      }
    },
    cloned = clone( orig );


console.assert(
  cloned.hasOwnProperty("foo"), "Cloned object has a property `foo`"
);
console.assert(
  cloned.hasOwnProperty("inner"), "Cloned object has a property `inner`"
);
console.assert(
  cloned.inner.hasOwnProperty("prop"), "`cloned.inner` object has a property `prop`"
);
console.assert(
  cloned.inner.hasOwnProperty("array"), "`cloned.inner` object has a property `.array`"
);
console.assert(
  Array.isArray(cloned.inner.array), "`cloned.inner.array` is an array"
);

// Change a value of the original `inner.array`
cloned.inner.array[0] = "a";

console.assert(
  orig.inner.array[0] !== cloned.inner.array[0],
  "Set cloned.inner.array[0] = 'a'; orig.inner.array[0] !== cloned.inner.array[0]"
);

cloned.foo = "qux";

console.assert(
  orig.foo !== cloned.foo, 
  "Set cloned.foo = 'qux'; orig.foo !== cloned.foo"
);