手写实现深拷贝-考虑对象或数组嵌套情况

102 阅读1分钟

实现深拷贝要点:

1. 判断类型
2. 检查是否是对象自身属性,原型属性不做拷贝
3. 存在深层嵌套则递归调用

深拷贝的实现

function deepCopy(object) {
//判断被拷贝的对象是否为数组或对象,因为基本数据类型直接拷贝即可
if (!object || typeof object !== "object") return;

let newObject = object instanceof Array ? [] : {};

for (let key in object) {
    // hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)
    //只拷贝对象自身属性不拷贝原型上的属性
    if (object.hasOwnProperty(key)) {
        newObject[key] = deepCopy(object[key]) ;
    }
}

return newObject;
}

hasOwnProperty() 方法使用参考链接

测试用例

const xiaoMing = {
    name: 'xiaomei',
    age: 34,
    address: {
        country: 'China',
        province: 'Guangdong',
        city: 'Cantoon'
    },
    car: ['BMW', 'GreatWall']
}

let xiaoBing = deepCopy(xiaoMing);

xiaoBing.name = 'xiaoBing';
xiaoBing.address = {
    country: 'China',
    province: 'Beijing',
    city: 'Beijing'
};
xiaoBing.age = 22;
xiaoBing.car =['Audi','Bench'];
for (let key in xiaoMing) {
    console.log(key, xiaoMing[key]);
}
for (let key in xiaoBing) {
    console.log(key, xiaoBing[key]);
}

输出结果

深拷贝实现.PNG 实现深拷贝参考视频讲解