您的位置:首页 > Web前端 > JavaScript

js中的拷贝问题

2017-09-06 11:41 190 查看

浅拷贝的实现

// 浅拷贝函数
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));

打印结果:



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

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

打印结果:



解决办法: 浅拷贝----->深拷贝

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

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

打印结果:



参考文档:http://www.cnblogs.com/MECN/p/6606119.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: