一、深拷贝与浅拷贝
深浅拷贝针对的都是引用类型
1.浅拷贝:拷贝基本数据类型时不会受到影响
拷贝引用对象时,原对象也会被修改
仅拷贝对象地址
白话文:假如b赋值a,当修改a时,b也会跟着变化
a1=[1,2,3]
a2=a1
console.log(a1,a2);
a1.push(4)
console.log(a1,a2);//a1=[1,2,3,4] a2=[1,2,3,4]
2.深拷贝:深拷贝是指拷贝一个对象的数据之前,先给拷贝的对象创建一个堆地址,这样当拷贝对象指向的堆中的数据改变时,
被拷贝的对象,堆中的数据不会改变
白话文:b赋值a,当修改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
slice的深拷贝就是指使用内置的copy函数来拷贝两个slice。
var arr1 = ["1","2","3"];
var arr2 = arr1.slice(0);
arr2[1] = "9";
console.log("数组的原始值:" + arr1 );//[1,2,3]
console.log("数组的新值:" + arr2 );[1,9,3]
(3)数组方法 concat
使用concat合并数组,会返回一个新的数组。
对象是一个引用数据类型 普通的复制是一个浅拷贝
var arr1 = ["1","2","3"];
var arr2 = arr1.concat();
arr2[1] = "9";
console.log("数组的原始值:" + arr1 );//[1,2,3]
console.log("数组的新值:" + arr2 );//[1,9,3]
(4)Json.parse(JSON.stringify)
1.
var arr1 = ["1","2","3"];
var arr2 = JSON.parse(JSON.stringify(arr1));
arr1.push(4)
console.log(arr1,arr2);
var obj1 = {
a: 1,
b: 2,
c: 3
}
2.
var objString = JSON.stringify(obj1); //将对象转换为json字符串形式
var obj2 = JSON.parse(objString); //将转换而来的字符串转换为原生js对象
obj2.a = 5;
console.log(obj1.a); // 1
console.log(obj2.a); // 5
3.
var test={
name:"zs",
age:23,
friends:["dwz1","dwz2","dwz3"]
};
var test1 = JSON.stringify(test);
test.friends[0]="dwz4"
console.log(test);
console.log(test1);
3.手动封装深浅拷贝
如果为true,进行深拷贝,如果为false,进行浅拷贝
return 返回的是copy后的对象
copyfun(对象,true)
a1=[1,2,3]
a2=copyfun([1,2,3],false) //a1变,a2变
a2=copyfun(a1,true) //a1变,a3不变
typeof(obj) --object
a1 instanceof Array
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)