function clone(source) {
	        if (source == null || typeof source != 'object') {
	            return source;
	        }

	        var result = source;
	        var typeStr = objToString.call(source);

	        if (typeStr === '[object Array]') {
	            result = [];
	            for (var i = 0, len = source.length; i < len; i++) {
	                result[i] = clone(source[i]);
	            }
	        }
	        else if (TYPED_ARRAY[typeStr]) {
	            result = source.constructor.from(source);
	        }
	        else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) {
	            result = {};
	            for (var key in source) {
	                if (source.hasOwnProperty(key)) {
	                    result[key] = clone(source[key]);
	                }
	            }
	        }

	        return result;
	    }
Those data types can be cloned:
    Plain object, Array, TypedArray, number, string, null, undefined.
Those data types will be assgined using the orginal data:
    BUILTIN_OBJECT
Instance of user defined class will be cloned to a plain object, without
properties in prototype.
Other data types is not supported (not sure what will happen).

Caution: do not support clone Date, for performance consideration.
(There might be a large number of date in `series.data`).
So date should not be modified in and out of echarts.

@param {*} source
@return {*} new