ES6- Day3 - 递归

6. 递归

6.1 什么是递归

如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
简单理解:函数内部自己调用自己, 这个函数就是递归函数
递归函数的作用和循环效果一样
由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件 return

6.2 利用递归求数学题
  1. 求 1 * 2 *3 … * n 阶乘。
function fn(n){
    if(n === 1){
        return 1;
    }
    return n * fn(n-1);
}
console.log(fn(4));
  1. 求斐波那契数列 。
function f(n){
    if(n === 1 || n === 2){
        return 1;
    }
    return f(n-1) + f(n-2);	
}
console.log(f(8));  // 21
  1. 根据id返回对应的数据对象
var data = [{
    id: 1,
    name: '家电',
    goods: [{
        id: 11,
        gname: '冰箱'
    },{
        id: 12,
        gname: '洗衣机',
    }]
},{
    id: 2,
    name: '服饰'
}];
var o = {};
// 输入id就可以返回数据对象
function getId(json, id){
    // var o = {};
    json.forEach(function(item){
        if(item.id == id){
            o = item;
        }else if(item.goods && item.goods.length >0){
            o = getId(item.goods,id);
        }
    });
    return o;
}
console.log(getId(data,11))
console.log(getId(data,1))
6.3 浅拷贝和深拷贝
  1. 浅拷贝只是拷贝一层, 更深层次对象级别的只拷贝引用, 只是把地址拷贝给了新对象
  2. 深拷贝拷贝多层, 每一级别的数据都会拷贝;新开辟一个空间,把新开辟的赋值给新对象
  3. Object.assign(target, ...sources) es6新增方法可以浅拷贝
6.3.1 浅拷贝
var obj = {
    id: 1,
    name: 'lili',
    msg: {
        age: 18
    }
};
var o = {};
//for(var i in obj){
//    o[i] = obj[i];
//}

Object.assign(o,obj);

// 当改变了拷贝的 o 里面的 age ,同时也会改变obj里面的 age
o.msg.age = 20;
console.log(o);
console.log(obj);
6.3.2 深拷贝
// 深拷贝拷贝多层, 每一级别的数据都会拷贝.
var obj = {
    id: 1,
    name: 'andy',
    msg: {
        age: 18
    },
    color: ['pink', 'red']
};
var o = {};
// 封装函数 
function deepCopy(newobj, oldobj) {
    for (var k in oldobj) {
        // 判断我们的属性值属于那种数据类型
        // 1. 获取属性值  oldobj[k]
        var item = oldobj[k];
        // 2. 判断这个值是否是数组
        // 因为数组也属于对象,所有要先判断是否是数组
        if (item instanceof Array) {
            newobj[k] = [];
            deepCopy(newobj[k], item)
        } else if (item instanceof Object) {
            // 3. 判断这个值是否是对象
            newobj[k] = {};
            deepCopy(newobj[k], item)
        } else {
            // 4. 属于简单数据类型
            newobj[k] = item;
        }

    }
}
deepCopy(o, obj);
console.log(o);

var arr = [];
console.log(arr instanceof Object);
o.msg.age = 20;
console.log(obj);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值