浅拷贝
拷贝就是把一个东西复制出一份一模一样的,以下就算一个拷贝,把a的值,一模一样的复制到b里面
var a = 2;
var b = a;
浅拷贝对于原始类型严格来说是不存在的,主要是针对对象、数组引用类型来说的
var p1 = {
name:'张三',
age: 18,
sex:'male',
height: 180,
weight: 140,
son:{
first: 'zhang',
sencod: 'si',
third: 'wu',
}
}
var p2 = p1;
p2.name = 'lisi';
console.log(p1, p2);
上面的写法拷贝的并不是对象的值,而是指向对象值的引用,就会导致改了一个另一个也会跟着改,虽然“拷贝”了,但是两个对象没有完全独立
解决方法
既然两个对象都指向同一个引用,那我们就将要拷贝的目标对象遍历,创建一个新对象作为被拷贝后的对象
var p2 = {};
for(var key in p1){
if(p1.hasOwnProperty(key){
p2[key] = p1[key];
}
}
上面写法任然存在问题,它只处理了原始值,没有处理引用值,对象中的引用值任然是会指向同一个地址的,因此就需要深拷贝
深拷贝
解决浅拷贝中对象属性为引用值的情况
思路:循环遍历需要拷贝的源对象,判断当前属性是否是元素自身 的属性,如果是的接着判断是否是引用类型同时不为null,通过typeof判断,然后根据不同的类型设置不同的接收容器,如果是数组,设置一个数组否则设置对象
function deepClone(org, target){
var target = target || {};
const arrstr = '[object Array]';
const strcall = Object.prototype.toString;
for(var key in org ){
if(org.hasOwnProperty(key)){
if(typeof org[key] == 'object' && typeof org[key] !== 'null'){
target[key] = strcall.call(org[key]) == arrstr ? [] : {};
deepClone(org[key], target[key]);
} else{
target[key] = org[key];
}
}
}
return target;
}
let p2 = deepClone(p1);
p2.son.forth = '4';
console.log(p1, p2);