chenshuhong / fullstack

我的全栈路线思维导图以及日常知识记录
MIT License
0 stars 0 forks source link

JavaScript之深浅拷贝 #8

Open chenshuhong opened 4 years ago

chenshuhong commented 4 years ago

JavaScript之深浅拷贝 浅拷贝

var shallowCopy = function(obj) {
    // 只拷贝对象
    if (typeof obj !== 'object') return;
    // 根据obj的类型判断是新建一个数组还是对象
    var newObj = obj instanceof Array ? [] : {};
    // 遍历obj,并且判断是obj的属性才拷贝
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = obj[key];
        }
    }
    return newObj;
}
chenshuhong commented 4 years ago

深拷贝最简单版本

JSON.parse(JSON.stringify(source));
function isObject(obj) {
    return typeof obj === 'object' && obj != null;
}
var deepCopy = function(obj) {
    if (!isObject(obj)) return obj;
    var newObj = obj instanceof Array ? [] : {};
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
        }
    }
    return newObj;
}
chenshuhong commented 4 years ago

处理循环引用和引用丢失 解决方案很简单,其实就是循环检测,我们设置一个数组或者哈希表存储已拷贝过的对象,当检测到当前对象已存在于哈希表中时,取出该值并返回即可。

chenshuhong commented 4 years ago

递归爆栈问题 广度优先或者循环代替递归