在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: '修改过的名字' } }