原生javascript方法实现深拷贝

//深拷贝---------->>>>>>>>
//遍历
//判断是否为原始值,是原始值直接浅拷贝
//判断是否为引用值(数组或对象),是的话直接创建新的数组或者对象
//递归,重复上述步骤

创建新对象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的属性和方法,成功地实现了对象的深拷贝,希望这篇文章对你会有帮助,记得点赞加关注哦!

  • 2
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kiss烟雨

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值