浅拷贝:浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。
深拷贝:深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。 深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象。
浅拷贝的码片
。
function extend(target,source){
target = target || {};
// 判断是否是对象
if(typeof target !== 'object'){
throw new Error('target不是对象')
}
// 判断source是否为空
if(!source){
throw new Error('source不能为空')
}
// 判断source是否对象
if(typeof source !== 'object'){
throw new Error('source不是对象')
}
// 循环 source
for(let key in source){
//然后将源来的对象的值赋值到target中
target[key] = source[key]
}
// 返回target
return target;
}
var obj = extend ({
a:1,
b:2,
c:3,
},{
a:2,
d:5,
})
console.log(obj)
深拷贝的码片
。
function deep(target,source){
if(typeof target !== 'obiect' || !target){
return source || target ;
}
if(typeof source !== 'object' || !source){
return source
}
for(let key in source){
var item = source[key];
if(typeof item === 'object' && item){
target[key] = deep(Array.isArray(item) ? [] : {} , item)
}else{
target[key] = item
}
}
return target
}
var obj = {
a:1,
b:2,
c:'sss'
}
var obj1 = {
a:2,
c:{
name:'张三',
age:20
}
}
var obj2 = deep(obj,obj1)
obj1.a= 3;
obj1.c.name='李四';
obj1.c.age=22,
console.log(obj2)