手撕 js 浅拷贝 深拷贝

浅拷贝
// 浅拷贝只是对被拷贝对象的简单复制,如果对象中还有对象,则保留对象的引用
function simpleClone(target) {
    const type = Object.prototype.toString.call(target).replace('[object ','').replace(']', '').toLowerCase();
    if(type === 'object') {
        return Object.assign({},target);
    } else {
        return target;
    }
}
深拷贝
// 深拷贝是对被拷贝对象的深层复制,对象中的对象也隔断链接关系
function deepClone(target, map = new Map()) {
    const type = Object.prototype.toString.call(target).replace('[object ','').replace(']', '').toLowerCase();
    if(typeof target === 'object') {
        if(type === 'date') {
            return new Date(target);
        }
        if(type === 'regexp') {
            return new RegExp(target);
        }
        let cloneTarget = Array.isArray(target) ? [] : {};
        // 添加map是为了防止循环引用内存溢出
        if(map.get(target)) return target;
        map.set(target, cloneTarget);
        for(let k in target) {
            cloneTarget[k] = deepClone(target[k], map);
        }
        return cloneTarget;
    } else {
        return target;
    }
}
测试
// 深拷贝测试
var arr = [
    { a: new Date(), aa: new RegExp('\\w+'), aaa: function() { console.log('aaa function') } }, 
    { b: 'qwe' }, 
    { c: [null, undefined] }, 
    { d: [{ da: 1, db: { dba: 123 }}] }
]
deepClone(arr);
// [
//     { a: 2021-07-14T11:41:48.289Z, aa: /\w+/, aaa: [Function: aaa] },
//     { b: 'qwe' },
//     { c: [ {}, undefined ] },
//     { d: [ [Object] ] }
// ]
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值