function(source) {
		if (helpers.isArray(source)) {
			return source.map(helpers.clone);
		}

		if (helpers.isObject(source)) {
			var target = {};
			var keys = Object.keys(source);
			var klen = keys.length;
			var k = 0;

			for (; k < klen; ++k) {
				target[keys[k]] = helpers.clone(source[keys[k]]);
			}

			return target;
		}

		return source;
	}
function(source) {
		if (helpers.isArray(source)) {
			return source.map(helpers.clone);
		}

		if (helpers.isObject(source)) {
			var target = {};
			var keys = Object.keys(source);
			var klen = keys.length;
			var k = 0;

			for (; k < klen; ++k) {
				target[keys[k]] = helpers.clone(source[keys[k]]);
			}

			return target;
		}

		return source;
	}
function ( source ) { if ( helpers . isArray ( source ) ) { return source . map ( helpers . clone ) ; } if ( helpers . isObject ( source ) ) { var target = { } ; var keys = Object . keys ( source ) ; var klen = keys . length ; var k = 0 ; for ( ; k < klen ; ++ k ) { target [ keys [ k ] ] = helpers . clone ( source [ keys [ k ] ] ) ; } return target ; } return source ; }
Returns a deep copy of `source` without keeping references on objects and arrays.
@param {*} source - The value to clone.
@returns {*}
Returns a deep copy of source without keeping references on objects and arrays .
Returns a clone of the source object.