目录:
了解深浅拷贝是什么:
浅拷贝:
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存
深拷贝:
深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
区别?
**区别:**浅拷贝只能复制第一层,想要深度拷贝的话就要用到深拷贝了
深拷贝的实现:
(1)递归复制所有层级的属性:
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
let a = [1,2,3,4]
let b = deepClone(a);
a[0] = 2;
console.log(a,b);
(2)通过JSON方法实现深拷贝
利用JSON的JSON.parse()和JSON.stringify()的两个方法实现
let arr=[1,3,{username:'kode'}];
let arr2=JSON.parse(JSON.stringify(arr));
arr2[2].username='duncan';
console.log(arr,arr4)
浅拷贝的实现:
(1)Object.assign()
var obj={a:{a:'kobe',b:39}};
var intalobj=Object.assign({},obj);
initalObj.a.a='wade';
console.log(obj.a.a);
assign()方法是把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。
但是他的拷贝方式不是固定的。
使用Object.assign()只能深拷贝一级属性,二级以上的属性(引用类型)就是浅拷贝了。如上方代码:为两级
(2)Array.prototype.concat()
let arr=[1,3,{username:'kobe'}];
let arr2=arr.concat();
arr2[2].username='wade';
console.log(arr)
concat()方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本
(3)Array.prototype.slice()
let arr=[1,3,{username:'kobe'}];
let arr3=arr.slice();
arr3[2].username='wade';
console.log(arr)
slice(start,end):方法可从已有数组中返回选定的元素,返回一个新数组,包含从start到end(不包含该元素)的数组元素。
注意:该方法不会改变原数组,而是返回一个子数组,如果想删除数组中的一段元素,应该使用Array.splice()方法
若有疑问,及时提出哦!
小作者在持续更新中…