Javascript基础之对象的拷贝

  不管其他博客上有多少总结到位,通俗易懂的博客和个例,知识还是别人的,并没有到你的肚子里面去。所以自己尽量不去搜索引擎里面Ctrl C,Ctrl V。上网查资料搞懂了之后,写个例子跑起来,没事就看看,这样的东西才是“深拷贝”。

首先看下面的例子:

	var objectA = {
		a:1,
		b:2,
		c:3
	};
	var objectB = objectA;
	objectB.c=10;
	console.log(objectA.c);   //10

上面现象的原因是对象传的是引用,objectA和objectB指向的是同一片内存

对象的浅拷贝和深拷贝的区别:浅拷贝基础的数据类型可以拷贝,深拷贝是拷贝对象中所有的部分,为对象中所有的东西重新开辟了一块地址。

下面浅拷贝的一种(Object.assign()):

var object1 = {
		sex:"male",
		age:20,
		friends:["liu","huang"],
		obj: {
			a:1
		}
	};
var objectFunction = Object.assign({},object1);   /*注意:js区分大小写*/
objectFunction.friends[0] = "function";
console.log(objectFunction.friends[0]); //function
console.log(object1.friends[0]); //function,被改变

objectFunction.obj.a=10000;
console.log(objectFunction.obj.a); //10000
console.log(object1.obj.a); //10000,被改变

  下面是深拷贝的两种方法:

1, JSON

var object1 = {
		sex:"male",
		age:20,
		friends:["liu","huang"]
	};
var object2=JSON.parse(JSON.stringify(object1));
//parse:将字符串转换为JSON格式,stringify:将object转换为字符串。这个过程开辟了新地址
	object2.friends[0] = "JSON";
	console.dir(object1);
	console.dir(object2);              

2, 递归函数

function f(base,copy)
	{
		var copy = copy || {};//初始化拷贝的对象,开辟一块新地址
		for(var i in base)//遍历对象的所有子节点
		{
			if(typeof base[i] ==='object')
			{
				if(base[i].constructor===Array)
					copy[i] = [];
				else
					copy[i] = {};
				arguments.callee(base[i],copy[i]);  //***********************递归调用
			}
			else 
			{
				copy[i]=base[i];
			}
		}
		return copy;
	} 
var temp;
	var object3 = f(object1,temp);
	object3.friends[0] = "deep";
	console.dir(object3);

console控制台结果如下:分别为object1,object2(JSON方法),object3(递归函数方法)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值