天天看點

拷貝和周遊DOM樹

一、淺拷貝:

拷貝就是複制,就相當于把一個對象中的所有内容,複制一份給另一個對象,直接複制,

或者說,就是把一個對象的位址給了另外一個對象,他們的指向相同,兩個對象之間有相同的屬性或者方法,都可以使用

<script>
   var obj1={
        age:24,
        sex:"男",
        name:"Eric"
    }
    var obj2={};
    //定義一個函數,把a對象中的所有屬性複制到對象b中
    function extend(a,b){
        for(var key in a){
            b[key]=a[key];
        }
    }
    extend(obj1,obj2);
    console.log(obj2.name);//Eric
    console.log(obj2.sex);//男
    console.log(obj2.age);//24
    </script>      

二、深拷貝:

拷貝還是複制,"深"是把一個對象中所有的屬性或者方法,一個一個的複制, 并且在另外一個對象中開辟相應的空間,一個一個的存儲到另外一個對象中

<script>
    var obj1={
        age:25,
        sex:"男",
        car:["奧迪","特斯拉","五菱"],
        dog:{
            name:"小白",
            age:6,
            color:"黃色"
        }
    };
    var obj2={};
    //通過函數,把對象a中的所有資料拷貝到對象b中
    function extend(a,b){
        for(var key in a){
            //先擷取a對象中每個屬性的值
            var item=a[key];
            //判斷這個值是不是數組
            if(item instanceof Array){
                //如果是數組,在對象b中添加一個新的屬性,并且這個屬性值也是數組
                b[key]=[];
                //調用這個方法,把a對象的這個數組的屬性值一個一個的複制到b對象這個數組屬性中
                extend(item,b[key]);
            }else if(item instanceof Object){//判斷這個值是不是對象類型的
                //如果是對象類型的,那麼在b對象中添加一個屬性,也是對象
                b[key]={};
                //調用這個方法,把a對象中的屬性對象的值.一個一個的複制到b對象的這個屬性對象中
                extend(item,b[key]);
            }else{
                //如果是普通的資料,直接複制到b對象這個屬性中
                b[key]=item;
            }
        }
    }
    extend(obj1,obj2);
    console.dir(obj2);//見下圖
    </script>      
拷貝和周遊DOM樹

三、周遊DOM樹:

1、代碼:

<div>
        <!-- 周遊DOM樹 -->
        <h1></h1>
        <p>
            <span></span>
            <span></span>
        </p>
    </div>
    <ul>
        <li>
            <a href="#"></a>
            <a href="#"></a>
            <a href="#"></a>
        </li>
        <li></li>
        <li></li>
    </ul>
    <script>
        //擷取頁面中的根節點---根标簽
        var root=document.documentElement;//html
        //根據根節點,調用fn的函數,顯示的是根節點的名字
        function forDOM(root1){
            //調用f1,顯示的是節點的名字
            f1(root1);
            //擷取根節點所有的子節點
            var children=root1.children;
            //調用周遊所有子節點的函數
            forChildren(children);
        }
        //給我子節點,把子節點的所有子節點顯示出來
        function forChildren(children){
            //周遊所有的子節點
            for(var i=0;i<children.length;i++){
                //每個子節點
                var child=children[i];
                //顯示每個子節點的名字
                f1(child);
                //判斷child下面有沒有子節點,如果有子節點,那麼就繼續周遊
                child.children&&forDOM(child);
            }
        }
        function f1(root){
            console.log("節點名字:======"+root.nodeName);
        }
        forDOM(root);
    </script>      
拷貝和周遊DOM樹

2、思路

拷貝和周遊DOM樹

轉載于:https://www.cnblogs.com/EricZLin/p/9083679.html