1.深拷贝:地址的拷贝
2.浅拷贝:是值得拷贝
深拷贝和浅拷贝的区别
A拷贝B B变A变是浅拷贝
A拷贝B B变A不变是深拷贝
数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型 (object,function,array)
3浅拷贝的实现方式
3-1 Object.assign()
/*Object.assign() 方法可以把任意
多个的源对象自身的可枚举属性拷贝给目标对象,
然后返回目标对象。但是 Object.assign()
进行的是浅拷贝,拷贝的是对象的属性的引用,
而不是对象本身。*/
let obj={a:{a:'kobe'},b:39};
let initobj=Object.assign({},obj);
initalObj.a.a="wade";
console.log(obj.a.a)//wade
//当object只有一层的时候,是深拷贝、
let obj={
username:'kobe'
}
let obj2=Object.assign({},obj)
obj2.username="wade"
console.log(obj)//={username:'kobe'}
3-2 Array.prototype.concat();
let arr=[1,4,{
username:'jiaojiao'
}]
let arr2=arr.concat();
arr2[2].username='jiaojiao1'
console.log(arr)
3-3 Array.prototype.slice()
let arr=[1,3,{username:' kobe'}];
let arr3=arr.slice();
arr3[2].username='wade'
console.log(arr);
4.深拷贝的实现方式
4-1
let arr=[1,3,{
username:'jiaojiao'
},function aa(){
console.log(1)
}]
let arr4=JSON.parse(JSON.stringify(arr));
arr4[2].username='jiaojiao2'
console.log(arr,arr4)
注:这个方法不能处理函数
这是因为 JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串,不能接受函数
4-2 函数库lodash
该函数库也有提供 _.cloneDeep 用来做 Deep Copy
var _=require('lodash');
var obj1={a:1,b:{f:{g:1}},c:[1,2,3]};
var obj2=_.cloneDeep(obj1);
console.log(obj1.b.f===obj2.b.f);







网友评论