学习内容:
深拷贝与浅拷贝 针对的都是引用类型
1.浅拷贝:拷贝基本数据类型的时候,不会受影响
拷贝引用数据类型的时候,源对象也会被修改
浅拷贝仅拷贝对象的地址
白话文:加入b复制了a,当修改a时,b也跟着变化
a1=[1,2,3]
a2=a1
console.log(a1,a2)
a1.push(4)
console.log(a1,a2)
2.深拷贝:是指拷贝一个对象的数据之前,先给拷贝的对象创建一个新的堆地址,这样当拷贝的对象指向的堆中的数据改变时,被拷贝的对象的堆中的数据不会改变
白话文:a复制了b,当修改a时,b不会改变
实现深拷贝方法:
(1)创建新数组,for循环复制
a1=[1,2,3]
a2=[]
for(var i in a1){
a2.push(a1[i])
}
a1.push(4)
console.log(a1,a2)//a1--[1,2,3,4]
//a2--[1,2,3]
(2)数组方法slice
a1=[1,2,3]
a2=a1.slice(0)
a1.push(5)
console.log(a1,a2)
(3)数组方法concat
a1=[1,2,3]
a2=a1.concat()
a1.push(7)
console.log(a1,a2)
(4)Json.parse(JSON.stringify)
var test={
name:"hyw",
age:23 ,
friends:["dwz1","dwz2","dwz3"]
};
var test1 = JSON.parse(JSON.stringify(test));//拷贝数组,注意这行的拷贝方法
test.friends[0]="dwz4"
console.log(test);
console.log(test1);
3.手动封装深浅拷贝 true---深拷贝 false---浅拷贝
return返回copy后的对象
Object.prototype.copyfun=function (a,b){
if(typeof(a)=="object"){
if(b==true){
return a2=JSON.parse(JSON.stringify(this))
}else{
return a3=a
}
}else{
return a1=a
}
}
var f1=([1,2,3])
f2=f1.copyfun(f1,false)
f1.push(4)
console.log(f1,f2)