JS深拷贝

一、

使用JSON.parse() 和 JSON.stringify(),但是它有局限性,当值为function、undefined、Symbol时,转换中会被忽略。

二、

function deepCopy(obj){
    var result = Array.isArray(obj) ? [] : {}
    for(var key in obj) {
        if (obj.hasOwnProperty(key)) {
            if(typeof obj[key] === 'object' && obj[key]!==null){
                result[key] = deepCopy(obj[key]);
            } else {
                result[key] = obj[key]
            }
        }
    }
    return result;
}

这部分参考自https://www.cnblogs.com/renbo/p/9563050.html

三、

function getType(obj){ // getType函数对元素进行类型判断
    var toString = Object.prototype.toString;
    var map = {
        '[object Boolean]': 'boolean',
        '[object Number]': 'number',
        '[object String]': 'string',
        '[object Undefined]': 'undefined',
        '[object Null]': 'null',
        '[object Object]': 'object',
        '[object Array]': 'array',
        '[object Function]': 'function',
        '[object Date]': 'date',
        '[object RegExp]': 'regExp'
    };
    if(obj instanceof Element){return 'element'}
    return map[toString.call(obj)]
}

function deepClone(data){
    var type = getType(data), obj;
    if(type === 'array'){
        obj = []
        for(var i = 0, len = data.length; i<len; i++){
            obj.push(deepCopy(data[i]))
            // obj[i] = deepCopy(data[i])
        }
    } else if(type === 'object'){
        obj = {}
        for(var key in data){
            obj[key] = deepCopy(data[key])
        }
    } else {
        return data;
    }
    return obj;
}

四、Object.assign() 与 slice() 只能实现浅拷贝

原文地址:https://www.cnblogs.com/songya/p/11490502.html