递归,浅拷贝和深拷贝

递归:自己调用自己

案例:累加和斐波那契数列

 function fn1() {
            var n = 10;
            console.log(n);
            fn2();
        }

        function fn2() {
            var n = 20;
            console.log(n);

        }
        fn1();


        //使用递归实现累加1+2+。。。+n
        function getSum(n) {
            //终止条件
            if (n == 1) {
                return 1;
            } else {
                return n + getSum(n - 1);
            }
        }
        console.log(getSum(10));

        //递归实现斐波那契数列
        function fib(n) {
            if (n === 1 || n == 2) {
                return 1;
            }
            return fib(n - 1) + fib(n - 2);
        }
        var m = 5;

        //输出前5项
        for (var i = 1; i < m + 1; i++) {
            console.log(fib(i));
        }

浅拷贝:就是单层复制,如果里面有对象和数组,就没有开辟新的内存。

 //浅拷贝---单层复制
        var obj1 = {
            name: 'zs',
            age: 18,
            dog: {
                name: '金毛',
                age: 2
            }

        };
        var obj2 = {};
        for (var key in obj1) {
            //这里不可以使用obj2.key 因为点是确定的属性,这里没有key这个属性,所以只能使用[]
            obj2[key] = obj1[key];
        }
        obj1.name = 'xx';
        obj1.dog.name = '大黄';  //这时对象1和对象2中的狗的名字都发生了改变,说明没有开辟新的内存
        console.dir(obj1); //对象1的名字发生了改变,但是对象2 的名字没有发生改变
        console.dir(obj2); // 因为重新开辟了内存

深拷贝---多层复制

 //深拷贝---多层复制
        var obj1 = {
            name: 'zs',
            age: 18,
            dog: {
                name: '金毛',
                age: 2
            },
            friends: ['ls', 'ww']
        };
        // 深拷贝,把o1的内容拷贝给o2
        function deepCopy(o1, o2) {
            for (var key in o1) {
                var item = o1[key];
                //如果是普通的对象是直接
                //如果是对象?
                if (item instanceof Object) {
                    o2[key] = {};
                    deepCopy(item, o2[key]);
                }
                //如果是数组?
                else if (item instanceof Array) {
                    o2[key] = [];
                    deepCopy(item, o2[key]);
                } else {
                    o2[key] = item;
                }
            }
        }
        var obj2 = {};
        deepCopy(obj1, obj2);
        obj1.name = 'xx';
        obj1.dog.name = 'xxx';
        obj1.friends[0] = 'hhh';
        console.dir(obj2);

使用递归遍历DOM树:

 <h1>遍历DOM树</h1>
    <p>可以在遍历的回调函数中任意订制需求</p>
    <ul id="list">
        <li>11</li>
        <li>21</li>
        <li>231</li>
    </ul>
    <div>
        <div>
            <span>hhh</span>
        </div>
    </div>
    <div id="demo_node">
        <ul>
            <li>
                123
            </li>
        </ul>
        <p>
            hello
        </p>
        <h2>world</h2>
        <div>
            <p>dsa</p>
            <h3>
                <span>dadada</span>
            </h3>
        </div>
    </div>

遍历所有的子元素:

 //遍历制定元素下的所有子元素
                                function loadTree(parent) {
                                    for (var i = 0; i < parent.children.length; i++) {
                                        var child = parent.children[i];
                                        console.log(child);
                                        loadTree(child);
                                    }
                                }
                                //遍历所有的子元素
                                loadTree(document.body);
                                //遍历ul下面的子元素
                                loadTree(document.getElementById('list'));
 //遍历指定元素下的所有子元素
        // callback是回调函数
        function loadTree(parent, callback) {
            for (var i = 0; i < parent.children.length; i++) {
                var child = parent.children[i];
                // console.log(child);
                if (callback) {
                    //处理找到的子元素
                    callback(child);
                }
                //递归调用
                loadTree(child);
            }
        }
        var ul = document.getElementById('list');
        loadTree(ul, function(element) {
            element.onclick = function() {
                console.log(this.innerText);
            }
        })

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值