javaScript基础面试题 --- 深拷贝和浅拷贝

文章介绍了JavaScript中浅拷贝和深拷贝的概念,通过示例展示了Object.assign在一级内容上的深拷贝和二级及以上内容的浅拷贝行为。同时,提供了使用递归实现深拷贝的方法,并指出该方法未完全处理所有数据类型,例如Function、Date等。文章还提醒读者注意深拷贝在处理特殊对象时可能需要额外处理。
摘要由CSDN通过智能技术生成

浅拷贝:只复制引用,而未复制真正的值,改变其中一个的值,另一个的值也随之改变
深拷贝:复制真正的值,改变其中一个的值,另一个的值不会改变

assign:一级内容深拷贝,二级及以上浅拷贝 一次把深拷贝和浅拷贝都写出来

// assin:一级内容深拷贝,二级及以上浅拷贝
let obj = {name:"Tom", age:18, job:["web"]}
let objCopy = Object.assign({}, obj)//这里一定要两个参数{},不然就全是深拷贝

// 深拷贝
console.log(obj)
console.log(objCopy)
objCopy.job[0] = "IT"
console.log(obj)
console.log(objCopy)

console.log("--------------------")

// 浅拷贝
console.log(obj)
console.log(objCopy)
objCopy.name = "Mick"
console.log(obj)
console.log(objCopy)

let objCopy = Object.assign({}, obj)//这里一定要两个参数{},不然就全是浅拷贝

递归实现深拷贝

递归实现深拷贝主要是对对象的每一个属性进行递归复制。下面是一个递归实现深拷贝的基本示例:
这是简单版本的,因为只考虑到数组和对象,其他类型的没有考虑,真正的深拷贝,还会考虑到function类型,date类型等等…

function deepClone(target, map = new Map()) {
    if (typeof target === 'object' && target !== null) {
        // 避免循环引用问题
        if (map.has(target)) {
            return map.get(target);
        }

        // 处理数组和对象的情况
        const cloneTarget = Array.isArray(target) ? [] : {};
        map.set(target, cloneTarget);

        for (let key in target) {
            if (target.hasOwnProperty(key)) {
                cloneTarget[key] = deepClone(target[key], map);
            }
        }

        return cloneTarget;
    } else {
        return target;
    }
}

// 示例
const obj = {
    num: 0,
    str: '',
    boolean: true,
    unf: undefined,
    nul: null,
    obj: { name: 'I am an object', id: 1 },
    arr: [0, 1, 2],
    func: function() { console.log('I am a function') },
    date: new Date(0),
    reg: new RegExp('/I am a regular expression/ig'),
    [Symbol('key')]: 'I am a symbol',
    error: new Error('I am an error object'),
    map: new Map([['name', 'I am a map']]),
    set: new Set([1, 'I am a set'])
};

const clonedObj = deepClone(obj);

console.log(clonedObj);
console.log(clonedObj.obj !== obj.obj);  // true,说明确实进行了深拷贝

注意:这个示例并不完整,例如对于某些特殊对象(如 FunctionDateRegExpErrorMapSet 等),可能还需要进行特定的处理。此外,不同的应用场景可能对深拷贝的需求有所不同,因此需要根据具体情况对上述代码进行适当的调整或扩展。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值