javaScript 前端面试题 30天学习计划 ----(第四天)
日常任务
- 前端面试题练习
- 复习前一天所学知识
浅拷贝和深拷贝? 参考
概念: 简单的说拷贝后,被拷贝对象或者拷贝对象其中一个发生变化会对另一方产生影响的称为浅拷贝,反之称为深拷贝。
内容:
- 在js中,基本数据类型的名值储存在栈内存中,变量的拷贝会把被拷贝对象的值赋给拷贝对象,对拷贝对象的值进行修改不会影响被拷贝对象。
- 而引用数据类型的值在栈内存中储存的是一个指向堆内存的引用地址,变量的拷贝是把被拷贝对象的引用地址赋给拷贝对象,两者都指向同一个堆内存地址,所以任何一个的修改,另一方都会发生变化。
如何实现深拷贝?
- 递归复制:遍历对象的所有属性,复制每一个参数;
var a = [1,2,3,{a:'哈哈',b:'嘿嘿'}];
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
var b = deepClone(a);
a[3].a = '啦啦';
console.log(b);
- JSON.parse 与 JSON.stringify
var a = [1,2,3,{a:'哈哈',b:'嘿嘿'}];
var b = JSON.parse(JSON.stringify(a));
a[0] = 2;
a[3].a = '啦啦';
console.log(b);
|