js深浅拷贝个人笔记

浅拷贝

...Es6展开运算符
concat() 数组合并
slice() 对象/数组
Object.assign() 对象的合并

首层浅拷贝

const shallowClone = ((targetArray) => {
    const result = targetArray.constructor === Array ? []: {}; // 判断复制的目标是数组还是对象
    for (let keys in targetArray) {
        if (targetArray.hasOwnProperty(keys)) {
            result[keys] = targetArray[keys];
        }
    }
    return result;
});

深拷贝

方案一 JSON.parse(JSON.stringify())

const target = {
	a: 1,
	b: 2,
};
const result = JSON.parse(JSON.stringify(target));

注意: 如果目标对象 包含undefined、symbol、function 这个方法不适应,原因是在转换过程中产生损耗,在编译过程中会被忽略


方案二 递归

// 如果是存在引用拷贝
const alreadyArray = new Map();
const deepEVent = ((targetArray) => {
    const result = targetArray.constructor === Array ? [] : {}; // 判断复制的目标是数组还是对象
    for (let keys in targetArray) {
        // 是否存在引用对象,并且避免是引用类型数据 死循环调用
        if (targetArray.hasOwnProperty(keys) && !alreadyArray.get(targetArray[keys])) {
        	// 如果存在 且是复杂数据类型
            if (targetArray[keys] && typeof targetArray[keys] === 'object') {
            	// 使用Map记录该值已经存在
                alreadyArray.set(targetArray[keys], true);
                // 进入递归循环
                result[keys] = targetArray[keys].constructor === Array ? [] : {};
                result[keys] = deepEVent(targetArray[keys]);
            } else {
                result[keys] = targetArray[keys];
            }
        }
    }
    return result;
});

递归实现, 如果键是对象或者是数组,则新创建一个空数组/空对象,否则直接赋值即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值