首页 > 代码库 > 容易忽略的坑——对象的深拷贝
容易忽略的坑——对象的深拷贝
之前看到一个对象拷贝的问题,没仔细想就写出来了这个代码:
function copy(obj)
{
var result = {};
for(var key in obj){
//判断是否自己的项
if(obj.hasOwnProperty(key)) {
result[key] = obj[key];
}
}
return result;
}
今天偶然才发现这是个坑,如果是一般的对象例如:
var obj1 = {
name:"bing",
age:20,
sayName : function(){
console.log(this.name);
}
}
完全没有问题。但是如果碰到下面这种情况就有大问题了:
var obj1 = {
name:"bing",
age:20,
obj:{
add : "bei"
},
arr:[1,2,3],
sayName : function(){
console.log(this.name);
}
}
这个对象是比上个对象多了两个参数,一个obj对象类型,一个arr数组类型,然后尝试修改这两项的值会发现复制不好使了:
var obj2 = copy(obj1);
obj2.arr[1] = "123";
console.log(obj1.arr[1]); //123
console.log(obj2.arr[1]); //123
修改一个对应的值另一个也会改变,原因在于copy函数加粗的这个赋值,它只是一个浅拷贝,传的是这两项的引用。所以正确做法应该是深层次的递归拷贝:
function deepCopy(obj)
{
if(obj instanceof Array){
var result = [];
}else if(obj instanceof Object){
var result = {};
}else{
return obj;
}
for(var key in obj){
if(obj.hasOwnProperty(key)) {
var value = http://www.mamicode.com/obj[key];
if (value instanceof Object) {
result[key] = arguments.callee(value);
} else {
result[key] = value;
}
}
}
return result;
}
这次就好了:
var obj2 = deepCopy(obj1);
obj2.arr[1] = "123";
console.log(obj1.arr[1]); //2
console.log(obj2.arr[1]); //123
通过加粗语句来递归复制,以保证能够每一项内部元素都能够被复制到。
写此文章引以为戒,希望别人别再栽进这个坑里面了。
第一次写博客,好多不懂的地方,原来都是看各位大神的博客,把自己感觉重要的博客收藏或者把自己认为重要的知识点记到word中排版整理好,但是现在有一种闭门造车的感觉,认识到自己的学习方法需要改进以后会把自己遇到的问题和心得写出来,如果有问题欢迎各路大牛拍砖。
容易忽略的坑——对象的深拷贝
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。