美文网首页
js ,对象深度复制

js ,对象深度复制

作者: xx_Zero | 来源:发表于2019-10-17 19:12 被阅读0次

1、基于ES5语法

var deepClone = function (obj) {

    var copy;

    // 处理3种基础类型,和null、undefined

    if (obj === null || typeof obj !== 'object') return obj;

    // 处理日期

    if (obj instanceof Date) {

        copy = new Date();

        copy.setTime(obj.getTime());

        return copy;

    }

    // 处理数组

    if (obj instanceof Array) {

        copy = [];

        for (var i = 0, len = obj.length; i < len; i++) {

            copy[i] = AIMap.deepClone(obj[i]);

        }

        return copy;

    }

    // 处理函数

    if (obj instanceof Function) {

        copy = function () {

            return obj.apply(this, arguemnts);

        }

        return copy;

    }

    // 处理对象

    if (obj instanceof Object) {

        copy = {};

        for (var attr in obj) {

            if (obj.hasOwnProperty(attr)) copy[attr] = AIMap.deepClone(obj[attr]);

        }

        return copy;

    }

    throw new Error("Unable to copy obj as type isn't suported" + obj.constructor.name)

}

2、基于ES6 语法

let deepClone=function(value, hash = new WeakMap) { // WeakMap弱引用,不要用map

    if (value == null) {

        return null;

    }

    if (value instanceof RegExp) {

        return new RegExp(value);

    }

    if (value instanceof Date) {

        return new Date(value);

    }

    //函数不需要拷贝

    if (typeof value != 'object') return value;

    let obj = new value.constructor(); //判断是对象还是数组 并且new

    if (hash.get(value)) { //如果这个对象拷贝过了 就返回那个拷贝的结果就可以了

        return hash.get(value);

    }

    hash.set(value, obj); //如果这个对象没有拷贝过 就添加到WeakMap里面

    for (let key in value) { // in 会遍历当前对象上面的属性和__proto__指代的属性

        if (value.hasOwnProperty(key)) {

            // 如果值还有可能是对象 就利用递归继续拷贝

            obj[key] = deepClone(value[key], hash)

        }

    }

    return obj;

}

相关文章

网友评论

      本文标题:js ,对象深度复制

      本文链接:https://www.haomeiwen.com/subject/zadjuctx.html