//深拷贝---------->>>>>>>>
//遍历
//判断是否为原始值,是原始值直接浅拷贝
//判断是否为引用值(数组或对象),是的话直接创建新的数组或者对象
//递归,重复上述步骤
创建新对象person1
var person1 = {
name: '张三',
age: 18,
sex: 'male',
height: 180,
weight: 140,
sayFunction: function (){
console.log('Hello');
},
chlidren: {
first: {
name: '张小一',
age: 13
},
second: {
name: '张小二',
age: 7
},
third: {
name: '张小三',
age: 3
}
},
car: ['Benz','Mazda']
}
深拷贝函数
function deepClone(origin,target){
var target = target || {},//容错,包含了传入空值的情况
toStr = Object.prototype.toString,//用于判断对象是否是数组
arrType = '[object Array]';//判断数组时方便进行比对
for(var key in origin){
if(origin.hasOwnProperty(key)){
//hasOwnProperty表示是否有自己的属性。这个方法会查找一个对象是否有某个属性,但是不会去查找它的原型链
if(typeof(origin[key]) === 'object' && origin[key] !== null){
//判断是否为对象,并且排除了特殊情况null
if(toStr.call(origin[key]) === arrType){
//判断是否为数组
target[key] = [];
//是数组则创建空数组
}else{
target[key] = {};
//不是数组则创建空对象
}
deepClone(origin[key],target[key]);
//开始递归,遍历引用值
}else{
//不是引用值就是原始值,是原始值则直接克隆
target[key] = origin[key];
}
}
}
return target;//把新克隆的对象返回至外部
}
创建一个空对象person2,执行拷贝函数
var person2 = {};
deepClone(person1,person2);
在控制台上查看是否拷贝成功
可以看到新拷贝的对象person2已经成功的显示了出来,我们来修改一下person2,看一下对person1有没有影响
person2.name = '李四';
person2.age = 20;
person2.sex = 'female';
person2.chlidren.forth = {
name: '张小四',
age: 1
}
person2.sayFunction = function (){
console.log('World!')
}
person2.car.push('BYD');
这里我修改了person2的一些属性和一个方法(person1的一个方法是console.log(‘Hello’)),再次打印两个对象和方法,让我们来看看结果是什么样的吧,打开控制台
console.log(person1);
console.log(person2);
person1.sayFunction();
person2.sayFunction();
可以看到,我们对person2做了一些修改,这并没有改变person1的属性和方法,成功地实现了对象的深拷贝,希望这篇文章对你会有帮助,记得点赞加关注哦!