Loading

拷贝和遍历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树:

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>

2、思路

 

posted @ 2018-05-24 16:42  澎湃_L  阅读(421)  评论(0编辑  收藏  举报