JS浅拷贝和深拷贝

在JS中,深浅拷贝是相对于对象来说的,对象里面嵌套了对象的时候,才有深浅拷贝的区别。

浅拷贝中,嵌套的对象只是一个引用,当原来的对象改变的时候,拷贝后的也会跟着改变。

let people = {
    age: 18,
    friend: {
        name: "原来的名字"
    }
};
// 浅拷贝
let peopleCopy = {};
for (let key in people) {
    peopleCopy[key] = people[key];
}
peopleCopy.age = 20;
peopleCopy.friend.name = 'qwe';
console.log(people);
console.log(peopleCopy);

输出的结果:

{ age: 18, friend: { name: 'qwe' } }
{ age: 20, friend: { name: 'qwe' } }

浅拷贝中基本类型是独立的,拷贝后的age改变,原对象不会改变,但是浅拷贝的对象中嵌套的对象改变后,原来的对象也跟着改变。

深拷贝就是将嵌套的对象也进行拷贝。这里就能使用递归来实现深拷贝了。

// 深拷贝-递归拷贝
let people = {
    age: 18,
    friend: {
        name: "原来的名字"
    }
};
function deepCopy(obj) {
    let peopleCopy = {};
    for (let key in obj) {
        if (typeof (obj[key]) === 'object') {
            peopleCopy[key] = deepCopy(obj[key]);
        } else {
            peopleCopy[key] = obj[key];
        }
    }
    return peopleCopy;
}
let result = deepCopy(people);
result.age = 30;
result.friend.name = '修改过的名字';
console.log("原对象:", people);
console.log("深拷贝的对象:", result);

深拷贝结果:

原对象: { age: 18, friend: { name: '原来的名字' } }
深拷贝的对象: { age: 30, friend: { name: '修改过的名字' } }
posted @ 2020-03-09 19:52  HanJunOvO  阅读(209)  评论(0编辑  收藏  举报