浅拷贝
对于引用数据类型,对象名存储在栈内存中,对象值则存储在堆内存中,同时栈内存会提供一个引用指向堆内存中的值。浅拷贝只会将对象的各个属性进行依次复制,并不会进行递归复制,而 JavaScript 存储对象都是存地址的,所以浅拷贝会导致两个对象引用指向同一块堆内存地址。如果需要两个指向不同堆内存且值相同的对象,则需要使用深拷贝。
深拷贝
定义如下对象:
var student = {
id : '01',
name : '张三',
achievement : {
Chinese : 80,
Mathematics : 90,
English : 89
},
family : ['Dad', 'mom', 'Grandpa', 'grandma']
}
JSON实现深拷贝
var result = JSON.parse(JSON.stringify(student))
递归实现深拷贝
function deepCopy(obj) {
let newObj = (obj instanceof Array ? [] : {});
if (obj && typeof obj === 'object') {
for(key in obj){
if(typeof obj[key] === "object"){
newObj[key] = deepCopy(obj[key]);
}else{
newObj[key] = obj[key];
}
}
}
return newObj;
}
var student2 = deepCopy(student);