js中的拷贝问题

js中的拷贝问题

浅拷贝的实现


// 浅拷贝函数
var dad = {name:'chen',age:18};
var son = {sex:'男'};
function clone(dad,son){
  var son = son || {};//判断s对象是否存在,不存在则定义s为空对象
 for (var prop in dad) {
    son[prop] = dad[prop];
  };
  return son;//返回s对象
};

print(clone(dad,son));

打印结果:
js中的拷贝问题

但是假如,对象里面有子对象

var person = {
	name: 'chen',
	age:18,
	man: {
		hight:188
	}
};

那么在复制时浅拷贝只是将子对象的一个引用地址复制给son对象;son和person里的man 属性都指向同一个对象,故改变任一个都能影响到另外一个:
例子如下:

var dad = {
	name:'chen',
	age:18,
	man: { 
		hight:188
	}
}
var son = {
	sex:'男'
};
// 浅拷贝函数
function clone(dad,son){
  var son = son|| {}; //判断s对象是否存在,不存在则定义s为空对象
  for (var prop in dad){
    son[prop]=dad[prop];
  };
  return son;//返回s对象
};

clone(dad,son);  // 进行浅拷贝
son.name='ze';
console.log(son.name);//打印ze
console.log(dad.name);//打印chen
son.man.hight=1999;
console.log(son.man.hight);//打印1999
console.log(dad.man.hight);//打印1999

打印结果:
js中的拷贝问题

解决办法: 浅拷贝----->深拷贝
深拷贝可以很好的解决引用类型的拷贝问题,采用递归的方法去复制拷贝对象,从而解决浅拷贝带来的弊端

var dad = {
	name:'chen',
	age:18,
	man: {
		hight:188
	}
}

var son = {
	sex:'男'
};

// 深拷贝函数
function clone(dad,son){
   var son = son || {};//判断s对象是否存在,不存在则定义s为空对象
   for (var prop in dad) {
		if (typeof dad[prop]=='object') {
			//三元运算,将s[prop]初始化为数组或者对象
			son[prop] = (dad[prop].constructor === Array) ? [] : {};
			clone(dad[prop],son[prop]);
		}
		else{
			son[prop]=dad[prop];
		}
	};
	return son;//返回s对象
};

clone(dad,son);
son.name='ze';
console.log(son.name);//打印ze
console.log(dad.name);//打印chen
son.man.hight=1999;
console.log(son.man.hight);//打印1999
console.log(dad.man.hight);//打印188

打印结果:
js中的拷贝问题

参考文档:http://www.cnblogs.com/MECN/p/6606119.html