Creates a clone of `value`. If `deep` is `true` nested objects will also
be cloned, otherwise they will be assigned by reference. 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).

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

var stooges = [
{ 'name': 'moe', 'age': 40 },
{ 'name': 'larry', 'age': 50 }
];

var shallow = _.clone(stooges);
shallow[0] === stooges[0];
// => true

var deep = _.clone(stooges, true);
deep[0] === stooges[0];
// => false

_.mixin({
'clone': _.partialRight(_.clone, function(value) {
return _.isElement(value) ? value.cloneNode(false) : undefined;
})
});

var clone = _.clone(document.body);
clone.childNodes.length;
// => 0
function clone(value, deep, callback, thisArg) {
      // allows working with "Collections" methods without using their `index`
      // and `collection` arguments for `deep` and `callback`
      if (typeof deep != 'boolean' && deep != null) {
        thisArg = callback;
        callback = deep;
        deep = false;
      }
      return baseClone(value, deep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
    }