浅拷贝和深拷贝是JavaScript中常用的两种复制对象的方法,两者的差别在于复制后对象所指向的地址是否相同。如果新生成的对象与原对象的内存地址相同,我们就称为浅拷贝;如果新生成的对象与原对象的内存地址不同,那么就称为深拷贝。
浅拷贝的实现
浅拷贝可以通过Object.assign()
方法、扩展操作符或者遍历实现:
- Object.assign()方法实现浅拷贝
let target = {};
let source = {name: 'Peter', age: 25}
Object.assign(target, source);
console.log(target); // {name: 'Peter', age: 25}
- 扩展操作符实现浅拷贝
let target = {};
let source = {name: 'Peter', age: 25}
target = {...source};
console.log(target); // {name: 'Peter', age: 25}
- 遍历实现浅拷贝
let target = {};
let source = {name: 'Peter', age: 25}
for(let key in source) {
target[key] = source[key];
}
console.log(target); // {name: 'Peter', age: 25}
深拷贝的实现
深拷贝可以通过遍历实现。遍历过程中需要判断当前的值是否为对象,如果是的话对该对象进行递归操作,并且复制得到的新对象仍然为深拷贝。
- JSON.parse()和JSON.stringify()实现深拷贝
let target = {};
let source = {name: 'Peter', age: 25, address : {city: '上海', zip: '200000'}}
target = JSON.parse(JSON.stringify(source));
console.log(target); // {name: 'Peter', age: 25, address : {city: '上海', zip: '200000'}}
- 递归实现深拷贝
function deepClone(obj) {
if(obj === null) return null;
if(typeof obj === 'object') {
let newObj = obj.constructor === Array ? [] : {};
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
newObj[key] = deepClone(obj[key]);
}
}
return newObj;
} else {
return obj;
}
}
let target = {};
let source = {name: 'Peter', age: 25, address : {city: '上海', zip: '200000'}}
target = deepClone(source);
console.log(target); // {name: 'Peter', age: 25, address : {city: '上海', zip: '200000'}}
注意事项:递归实现深拷贝可能会在处理循环依赖的对象时,导致堆栈溢出,因此必须要考虑如何处理循环依赖问题。
以上就是JS中实现浅拷贝和深拷贝的代码详解,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS中实现浅拷贝和深拷贝的代码详解 - Python技术站