JavaScript_对象引用

首先,看一个例子,代码如下:

var a = 4;
var b = a;
b = 5;
console.log("b=" + b + " , a=" + a);
运行结果如下:

可以看出,上面的赋值只是简单的内容的复制,当改变b的值时是不会影响到a的值的。然而这种简单地赋值是相对于基本类型变量来说的,如:数字、字符串、布尔值、null、undefined等。而对于对象来说,赋值就不是这么简单的复制值了。

var a = [1,2,3];
var b = a;
b.push(4);
console.log("b: " + b);
console.log("a: " + a);
运行结果如下:

可以看出,通过将数组a赋值给数组b,当改变数组b时,数组a也将受到影响。这就是对象引用

由于对象之间是引用的关系,所以将数组a赋值给数组b时,并不是简单的将数组a复制给数组b,而是将数组a和数组b都指向了数组[1,2,3]所在的内存。a,b都是指向同一个引用,所以在修改了b时,也会影响a。

查看如下代码:

var a = [1,2,3];
var b = a;
b = [1,2,3,4];
console.log("b: " + b);
console.log("a: " + a);
运行结果如下:

可以发现,将代码做了少许的改动,运行结果就不一样了,修改b时,并没有影响到数组a。原因是将数组a赋值给数组b时,此时,a与b指向同一个引用,但是之后对数组b进行了重新的赋值,这时并不是对那个引用中的内容进行修改,而是将数组b指向了一个新的引用,所以对数组a并没有关系。

那如何实现对象之间的简单复制内容的赋值呢?

var obj = {
	a : 10
}
var obj2 = copy(obj);
obj2.a = 20;
console.log("obj.a : " + obj.a);
function copy(obj){
	var obj2 = {};
	for(o in obj){
		obj2[o] = obj[o];
	}
	return obj2;
}

运行结果如下:


通过创建一个copy()方法,可以实现对象之间的简单复制内容的赋值。但是这种方法还是存在问题的,如下:

var obj = {
	a : {b : 10}
}
var obj2 = copy(obj);
obj2.a.b = 20;
console.log("obj.a.b : " + obj.a.b);
function copy(obj){
	var obj2 = {};
	for(o in obj){
		obj2[o] = obj[o];
	}
	return obj2;
}
运行结果如下:

可以发现,当obj的属性对应的值不是基本类型的数据时,在修改了obj2的值之后,obj也会受到影响。称这种方法为“浅拷贝”。与浅拷贝对应的,肯定也有“深拷贝”


如何实现对象之间的深拷贝呢?

首先我们分析一下,为什么浅拷贝对象时,会出现上面的问题。从上面代码中的copy()方法中,可以看到,该方法只是简单的将obj中的属性赋值给obj2中,所以当obj中的属性是对象时,这就会出现对象引用所造成的问题了。所以在实现深拷贝时,不能简单的对属性进行赋值。在实现深拷贝时,用到了递归算法,如下:

var obj = {
	a : {b : 10}
}
var obj2 = deepCopy(obj);
obj2.a.b = 20;
console.log("obj.a.b : " + obj.a.b);
function deepCopy(obj){
	if(typeof obj != "object"){
		return obj;
	}
	var obj2 = {};
	for(o in obj){
		obj2[o] = deepCopy(obj[o]);
	}
	return obj2;
}
运行结果如下:

可以发现,深拷贝是不会出现浅拷贝中的问题的。







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值