JS对象深拷贝

方法一

var obj = {
    name:"Leon",
    age:17,
    hobby:function(){
        let hb = "swimming";
        return hb;
    }
}
var newObj = {};
for(val in obj){
    newObj[val] = obj[val];
}
console.log(newObj);

注意:
该方法只适用于简单类型的对象,不适用于对象里面嵌套对象;
即使拷贝成功,给新对象里的对象的变量重新赋值会改变原对象!

所以,对于复杂的对象(对象里面嵌套对象),我们要采用方法二;

方法二:递归

var obj = {
    name:"Leon",
    age:17,
    hobby:function(){
        let hb = "swimming";
        return hb;
    },
    data:{
        day:"Tus",
        time:"morning"
    },
    arr:[
        {name:"tt"},
        {name:"yy"}
    ]
}
function deepCopy(obj){
    let copyObj = Array.isArray(obj)?[]:{};
    for(var key in obj){
        copyObj[key] = typeof(obj[key])==="object"?deepCopy(obj[key]):obj[key];
    }
    console.log(copyObj==obj);//false
    return copyObj;
}
console.log(deepCopy(obj))

该方法使用于任何对象

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • js基本数据类型与对象指针(引用地址)存放在栈内存,对象实际存放在堆内存。变量标志符和值(基本数据和指针)保存在栈...
    igor_d140阅读 761评论 0 0
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,165评论 1 32
  • 浅复制和深复制都可以实现在已有对象基础上再生一份对象的引用,但是对象的实例存储都是在堆内存中,然后通过一个引用值去...
    她是我的bug阅读 865评论 0 4
  • javascript的数据类型有两种;基本数据类型和引用数据类型。 当我们拷贝一个引用数据类型变量的时候,然后操作...
    一代码农1970阅读 426评论 0 2
  • 1.使用slice或者concat进行数组深拷贝 对于值都是普通数据类型的数组,可以使用数组的slice或者con...
    WHU_GIS_LJ阅读 1,051评论 0 3