递归
-
什么是递归?
-
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
-
简单理解:函数内部自己调用自己,这个函数就是递归函数
var num = 1 function fn() { console.log('我要打印6句话'); if(num == 6) { return; } num++; fn(); } fn(); -
递归函数的作用和循环一样
-
递归函数很容易发生”栈溢出“错误(stack overflow),所以必须要加退出条件return
-
-
利用递归求数学题
-
求1到n的阶乘
function fn(n) { if(n == 1) { return 1; } return n * fn(n-1); } fn(); -
求斐波那契序列
function fn(n) { if(n == 1 || n == 2) { return 1; } return fn(n-1) + fn(n-2); } fn();
-
-
利用递归求:根据id返回对应的数据对象
-
var data = [{ id:1, name:'家电', goods:[{ id:11, gname:'冰箱' },{ id:12, gname:'洗衣机' }] },{ id:2, name:'服饰' }]; //我们想要输入id号,就可以返回的数据对象 //利用forEach遍历里面的每一个对象 function getID(json,id) { var o = {}; json.forEach(function(item) { if(item.id === id) { o = item; //我们想要得到里层的数据,可以利用递归函数 //里面应该有goods这个数组,且数组长度不为0 } else if(item.goods && item.goods.length > 0) { o = getID(item.goods,id); } }) return o; } console.log(getID(data,1));
-
-
浅拷贝和深拷贝
-
浅拷贝只是拷贝一层,更深层次对象级别的指拷贝引用
var obj = { id:1, name:'andy', msg:{ age:18 } }; var o = {}; for (var k in obj) { //k是属性名,obj[k]是属性值 o[k] = obj[k]; } //此为浅拷贝,其中深层次对象msg拷贝过去的是地址,在o修改msg中内容会影响obj中msg的内容 Object.assign(o,obj) -
Object.assign(target,…sources)
- 第一个参数是要拷贝过去的对象
- 第二个参数是原存在的对象
- 此方法为浅拷贝
-
深拷贝拷贝多层,每一级别的数据都会拷贝
//深拷贝拷贝多层,每一级别的数据都会拷贝 var obj = { id:1, name:'andy', msg:{ age:18 }, color:['pink','red'] }; var o = {}; //封装函数 function deepCopy(newobj,oldobj) = { for(var k in oldobj) { //判断我们的属性值属于哪种数据类型 //1.获取属性值 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 { newobj[k] = item; } //4.属于简单数据类型 } } deepCopy(o,obj);
-