js深拷贝和浅拷贝
一浅拷贝
1.for···in只循环第一层
function simpleCopy(obj1) {
var obj2 = Array.isArray(obj1)?[]:{};
for (let i in obj1){
obj2[i] = obj1[i];
}
return obj2;
}
var obj1 = {a:1,b:2,c:{d:3}};
var obj2 = simpleCopy(obj1);
debugger
obj2.a = 3;
obj2.c.d =4;
console.log(obj1);
console.log(obj2);
2.Object.assign方法
var obj = {
a:1,
b:2
}
var obj1 = Object.assign(obj);;
obj1.a = 3;
console.log(obj.a);
3.直接用=赋值
let a=[0,1,2,3,4];
b=a;
console.log(a===b);
a[0] = 1;
console.log(a,b);
二、深拷贝
1.采用递归去拷贝所有层级属性
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
}
let a=[1,2,3,4,{b:4}],
b=deepClone(a);
a[0] = 2;
a[4].b=5;
console.log(a,b);
2.通过json对象来实现深拷贝
function deepClone2(obj) {
var _obj = JSON.stringify(obj),objClone=JSON.parse(_obj);
return objClone;
}
let a=[1,2,3,4,{b:4}],
b=deepClone2(a);
a[0] = 2;
a[4].b=5;
console.log(a,b);
缺点:无法实现对对象中方法的深拷贝,会显示为undefind
3.通过jQuery的extend方法实现深拷贝
var array =[1,2,3,4];
var newArray = $.extend(true,[],array);
newArray[0] = 5;
console.log(array,newArray);
4.手动实现深拷贝
let obj1 = {
a:1,
b:2
}
let obj2 = {
a:obj1.a,
b:obj1.b
}
obj2.a = 3;
console.log(obj1,obj2);
5.如果对象的value时基本类型的话,也可以用object.assign()来实现深拷贝,但是要把它赋值给一个空对象
var obj = {
a:1,b:2
}
var obj1 = Object.assign({},obj);
obj1.a = 3;
console.log(obj,obj1);
6.用slice实现对数组的深拷贝
var arr1 = ["1","2","3"];
var arr2 = arr1.slice(0);
arr2[1] = "9";
console.log("数组的原始值:"+arr1);
console.log("数组的新值:"+arr2);
7.用concat实现对数组的深拷贝,当数组里面的值是基本数据类型,比如String,Number,Boolean时,属于深拷贝
var arr1 = ["1","2","3"];
var arr2 = arr1.concat();
arr2[1] = "9";
console.log(arr1,arr2);
//当数组里面的值是引用数据类型,比如Object,Array时,属于浅拷贝
var arr1 = [{a:1},{b:2},{c:3}];
var arr2 = arr1.concat();
arr2[0].a ="9";
console.log(arr1,arr2);
8.直接使用 var newObj = Object.create(oldObj)可以达到深拷贝的效果
function deepClone(initalObj,finalObj) {
var obj = finalObj||{};
for (var i in initalObj){
var prop = initalObj[i];
if (prop ===obj){
continue;
}
if (typeof prop ==='object'){
obj[i] =(prop.constructor ===Array)?[]:Object.create(prop);
} else{
obj[i] = prop;
}
}
return obj;
}
9.使用扩展运算符实现深拷贝
var car = {brand:"BMW",price:"380000",length:"5米" }
var car1 = {...car,price:"50000"};
console.log(car,car1);
10.lodash函数库实现深拷贝
11Reflect法
浙公网安备 33010602011771号