场景

当我们创建一个对象,想深度克隆的时候,如果是json或array,我们可以用

var result=JSON.parse(JSON.stringify( source)) 

达到深度克隆的效果,但这种只适用于纯数据的数组或者对象克隆。

下面为大家呈现一段,能对几乎所有类型进行深度克隆的javascript代码。

代码

/**
     * @Description 克隆对象
     * 能被克隆的对象类型:
     *     Plain object, Array, TypedArray, number, string, null, undefined.
     * 直接用原始数据进行赋值的数据类型:
     *     BUILTIN_OBJECT
     * 用户定义类的实例将克隆到一个原型中没有属性的普通对象。
     * @method clone
     * @param {*} source
     * @return {*} new
     */
    function clone(source) {
        if (source == null || typeof source !== 'object') {
            return source;
        }
        var result = source;
        var typeStr = Object.prototype.objToString.call(source);
        if (typeStr === '[object Date]') {
            result = new Date().setTime(obj.getTime());
        }
        else if (typeStr === '[object RegExp]') {
            result = this.cloneRegExp(source);
        }
        else if (typeStr === '[object Function]') {
            result = this.cloneFunction(source);
        }
        else if (typeStr === '[object Array]') {
            result = [];
            for (var i = 0, len = source.length; i < len; i++) {
                result[i] = this.clone(source[i]);
            }
        }
        else if (this.TYPED_ARRAY[typeStr]) {
            var Ctor = source.constructor;
            if (source.constructor.from) {
                result = Ctor.from(source);
            }
            else {
                result = new Ctor(source.length);
                for (var i = 0, len = source.length; i < len; i++) {
                    result[i] = this.clone(source[i]);
                }
            }
        }
        else if (!this.BUILTIN_OBJECT[typeStr] && !this.isDom(source)) {
            result = {};
            for (var key in source) {
                if (this.hasOwn(source, key)) {
                    result[key] = this.clone(source[key]);
                }
            }
        }
        return result;
    }