function cloneDeep(value, callback, thisArg) {
      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
    }
Creates a deep clone of `value`. If a callback is provided it will be
executed to produce the cloned values. If the callback returns `undefined`
cloning will be handled by the method instead. The callback is bound to
`thisArg` and invoked with one argument; (value).

Note: This method is loosely based on the structured clone algorithm. Functions
and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and
objects created by constructors other than `Object` are cloned to plain `Object` objects.
See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.

@static
@memberOf _
@category Objects
@param {*} value The value to deep clone.
@param {Function} [callback] The function to customize cloning values.
@param {*} [thisArg] The `this` binding of `callback`.
@returns {*} Returns the deep cloned value.
@example

var characters = [
  { 'name': 'barney', 'age': 36 },
  { 'name': 'fred',   'age': 40 }
];

var deep = _.cloneDeep(characters);
deep[0] === characters[0];
// => false

var view = {
  'label': 'docs',
  'node': element
};

var clone = _.cloneDeep(view, function(value) {
  return _.isElement(value) ? value.cloneNode(true) : undefined;
});

clone.node == view.node;
// => false