JS高级-浅拷贝、深拷贝

浅拷贝:拷贝就是复制,就相当于把一个对象中的所有内容复制一份给另一个对象,直接复制,或者说,就是把一个对象的地址给了另一个对象,他们指向相同,两个对象之间有共同的属性或方法,都可以使用。
把一个对象中的属性复制到另一个对象中
// 浅拷贝

   function extend(obj1,obj2){
    for(var key in obj1){
        obj2[key] = obj1[key];
    }
   }

        如果拷贝的对象中有属性是数组或者是对象,那么拷贝过来的是属性对应的地址,也就是说,如果更改了这个属性对应的值,拷贝过去的对象值也会做相应的更改。
深拷贝:给每一个属性值开辟了一个新的空间用来存储,更改对象对拷贝后的对象不会有影响。
// 深拷贝

    function extend2(Obj1, Obj2) {
        for (var key in Obj1) {
            var item = Obj1[key]
            if (item instanceof Array) {
                Obj2[key] = [];
                extend2(item, Obj2[key]);
            } else if (item instanceof Object) {
                Obj2[key] = {};
                extend2(item, Obj2[key]);
            } else {
                Obj2[key] = Obj1[key];
            }
        }
    }

一个栗子

    var a = {
        age:10,
        name:'小李',
        car:['宝马','奥迪'],
        dog:{
            name:'小黄',
            eat:'狗粮'
        }
    };

    var b = {};
    extend1(a,b);
    // extend2(a,b);
    
    a.dog.name = '小红';
    a.age = 22;
    console.log(a);
    console.log(b);

        如上面的代码,如果更改a的age属性,那么不管是深拷贝还是浅拷贝,b中对应的age的值是不会改变了,但是,如果更改了a.dog.name,浅拷贝对应的b对象的b.dog.name也会做相应的改变,但是深拷贝对应的b对象就不会做改变。
一个栗子:遍历DOM树

    var root = document.documentElement;
    //根据根节点找到所有的子节点
    function forNode(root){
        var child = root.children;
        forChild(child)
    }
    //根据子节点数组,输出所有的子节点
    function forChild(childList){
        for(var i = 0;i

你可能感兴趣的:(JS高级-浅拷贝、深拷贝)