浅拷贝、深拷贝
说明:个人觉得通过代码理解记忆效果最好~~~
---------------------------------------只有引用类型有深浅拷贝的概念-----------------------------------------------
浅拷贝:拷贝就是增加了一个指针指向已存在的内存(JavaScript并没有指针的概念,这里只是用于辅助说明),浅拷贝只是拷贝了内存地址,子类的属性指向的是父类属性的内存地址,当子类的属性修改以后,父类的属性也随之被修改。
//一个非常简单的浅拷贝
<script>
let arr=[1,2,3,4];
let arr1=arr; //浅拷贝:只拷贝了地址,但是未开辟空间
arr[0]=66;
console.log(arr); //[66, 2, 3, 4]
console.log(arr1); //[66, 2, 3, 4]
</script>
深拷贝:深拷贝就是增加一个指针,并申请一个新的内存,并且让这个新增加的指针指向这个新的内存地址使用深拷贝,在释放内存的时候就不会像浅拷贝一样出现释放同一段内存的错误,当我们需要复制原对象但又不能修改原对象的时候,深拷贝就是最好的选择。
实现方式:重新创建一个数组空间,将另一个空间中的元素循环复制到新空间中,这实际是两个独立的空间,对一个空间中的元素进行操作,另一个空间中的元素不会受到影响。
eg1:
<script>
let arr=[1,2,3,4];
let arr1=[]
for(let i=0;i<arr.length;i++){
arr1.push(arr[i]);
}
arr[0]=666;
console.log(arr,arr1); //[666, 2, 3, 4] , [1, 2, 3, 4]
</script>
eg2:
<script>
var obj={
"id":"01",
"name":"某某",
"sex":"female"
}
var deepObj=JSON.parse(JSON.stringify(obj))
deepObj.sex="male"
console.log(obj,deepObj);
</script>
eg3:
<script>
function Persion(id,name){
this.id=id;
this.name=name;
}
Persion.prototype.copy=function(){
let item=new Persion(this.id,this.name);
return item;
}
let p1=new Persion(1,"某某");
let p2=p1.copy();
p2.name="啧啧";
console.log(p1,p2);
</script>