js的浅克隆与深度克隆

克隆


普通克隆

//普通克隆
var origin = {
    name:"xiaoli",
    age:18,
    say:function(){
        console.log(this.name);
    }
}    
var target = {}
function clone(origin,target){
    var target = target || {};
    for(var prop in origin){
        target[prop] = origin[prop];
    }
    return target;
}
clone(origin,target);

深度克隆

/*
遍历对象   for in
1.判断是不是原始值  typeof() object
2.判断时数组还是对象instanceof   toString  constructor
3.建立相应的数组或对象
递归....
if(typeof(origin[prop]))
*/
var obj = {
    name: "abc",
    age: 123,
    card: ["visa", "unionpay"],
    wife: {
        name: "bcd",
        son: {
            name: "erzi"
        }
    }
}
var obj1 = {};
function deepClone(origin, target) {
    var target = target || {},
        toStr = Object.prototype.toString,
        arrStr = "[object Array]",
        objStr = "[object Object]";
    
    for (var prop in origin) {
        if (origin.hasOwnProperty(prop)) {
            if (origin[prop] !== "null" && typeof (origin[prop]) == "object") {
                //是的话代表引用值
                if (toStr.call(origin[prop] == arrStr)) {
                    target[prop] = [];
                } else {
                    target[prop] = {};
                } 
                deepClone(origin[prop],target[prop]);
            } else {
                target[prop] = origin[prop];
            }
        }
    } 
    return target; 
}
deepClone(obj, obj1);
// console.log(deepClone(obj));
console.log(obj1);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 听到这个名字的时候都被吓尿了。克隆听起来就很屌的样子。不过其实琢磨了一下根本没有什么好尿的——我特别讨厌一些人故作...
    蚊子爸爸阅读 12,489评论 12 30
  • 因为近日的项目需要用到对数组做深克隆,所以做一个简要介绍与总结。 一开始听说这个概念的时候吓一跳,觉得高深莫测,有...
    FJW135阅读 696评论 0 1
  • 什么是深克隆,什么是浅克隆呢? 首先,克隆只针对对象、数组、函数等复杂数据。浅克隆就是将栈内存中的引用复制一份,赋...
    七胖子阅读 560评论 2 1
  • 一、概念 深度克隆:深度克隆的新对象可以完全脱离原对象,我们对新对象的修改不会反映到原对象中 二、知识点储备: 1...
    起这么长的名字根本没有用阅读 1,406评论 4 5
  • —“我老婆被抓走了,求求你救救她!” —“来把昆特牌吧。” —“这个村还没人赢得了我!” ——《巫师3》中解决问题...
    老张的瞎写日常阅读 137评论 0 0