<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>递归函数及深浅拷贝</title></head><body><script>// 递归函数:一个函数在内部调用本身,我们就说这个函数是递归函数,自己调用自己,防止栈溢出,一定要加上return;// 打印6句话let num=1;function fn(){console.log("递归打印");if(num<=6){console.log(num);num++;fn();}return;}fn();// 应用:利用递归求阶乘function f(n){// 递归必须加return实行退出if(n==1) return 1;return  n*f(n-1);}console.log(f(4));// 递归求斐波那契数列(兔子数列)1 1 2 3 5 8 13 21 ...前两项的和就是后一项// 01 用户输入一个数字,就可以求出是这个数字对应的兔子序列  输入3 打印3对应的序列值2let start=0;let sum;function g(n){if(n==2||n==1) return 1;return g(n-1)+g(n-2);}console.log("递归数列:")console.log(g(3));// 02 应用 根据id返回数据对象var data=[{id:1,name:'家电',goods:[{id:11,gname:'冰箱'},{id:12,gname:'洗衣机'},{id:13,gname:'服饰'}]},{id:2,name:'哈哈',goods:[{id:21,gname:'冰箱2'},{id:22,gname:'洗衣机2'},{id:23,gname:'服饰2'}]}]var ooo={};function getId(arr,id){// 遍历数组arr.forEach((item)=>{if(item.id==id){ooo=item;return item;  //赋值给else if的递归结果// 利用递归,遍历里层数据  如果外面没有的话}else if(item.goods && item.goods.length>0){ooo=getId(item.goods,id);}});return ooo;}console.log("根据id返回对象:")console.log(getId(data,1));console.log(getId(data,12));console.log(getId(data,23));// 3-浅拷贝 拷贝一层  里面的goods拷贝的是地址 导致两个地址一样var b=[];// 浅拷贝方法1// for(let key in data){//     b[key]=data[key];// }// 浅拷贝方法2Object.assign(b,data);console.log("b拷贝")console.log(b);  b[0].goods[0].gname="呵呵呵浅拷贝地址相同改名";  //导致b和 data都改了console.log(data);//04深拷贝  将拷贝的数据开辟另外的空间function deepClone(obj){if(typeof(obj)!="object"||!obj) return;let newObj=Array.isArray(obj)?[]:{};for(let key in obj){// 拥有key值if(obj.hasOwnProperty(key)){// 进行递归  数组对象就递归deepClone再次查询 简单类型直接赋值newObj=typeof(key)=="object"?deepClone(obj[key]):obj[key];}}return newObj;}c=deepClone(data);console.log("深拷贝")console.log(c);c.goods[0].gname="深拷贝修改";console.log(data); //深拷贝没有修改到原先的数据</script></body>
</html>

js递归函数及深浅拷贝相关推荐

  1. JS中深浅拷贝 函数封装代码

    一.了解 基本数据类型保存在栈内存中,按值访问,引用数据类型保存在堆内存中,按址访问. 二.浅拷贝 浅拷贝只是复制了指向某个对象的指针,而不是复制对象本身,新旧对象其实是同一内存地址的数据,修改其中一 ...

  2. JS(JavaScript)中实现深浅拷贝的几种方式(详细阅读 非常重要)。

    在了解深浅拷贝之前,我们先一起来简单来了解一下,JavaScript 数据存储的方式,以及数据类型(). JavaScript 中数据存储分为 简单数据类型和复杂数据类型(引用数据类型) 其中 5 种 ...

  3. JS 中对象的深浅拷贝(ES3、ES5、ES6不同方法底层实现,一文搞清楚深浅拷贝面试常问题)

    JS 中对象的深浅拷贝   拷贝我们都知道这个词的意思,我们经常做过复制.粘贴的操作,其中的复制就是拷贝,那么在拷贝的时候,如果我们复制出来的内容和原内容是完全的分开,各自不相影响,那么这就属于深拷贝 ...

  4. js中深浅拷贝理解与方法

    深浅拷贝的方法 堆栈理解 基本数据类型 number.string.boolean.null.undefined 引用数据类型 object.function.array 栈内存 存储基本数据类型内容 ...

  5. 9012年,当我们讨论js深浅拷贝时我们在说些什么?

    前言: 本文主要阅读对象:对深浅拷贝印象模糊对初级前端,想对js深浅拷贝聊一聊的中级前端.如果是对这些有完整对认知体系和解决方法的大佬,可以选择略过. 复制代码 正文: 讨论深浅拷贝,首先要从js的基 ...

  6. php深浅拷贝,js实现深浅拷贝方法

    说起深浅拷贝,我觉得需要理清楚 值类型 和 引用类型,本文主要和大家分享js实现深浅拷贝方法,希望能帮助到大家. 值类型 所谓 值类型 就是 undefined,null,number, string ...

  7. 手写深浅拷贝(js)

    关于深浅拷贝的原理介绍可以看之前的文章--超清晰,一文理解深浅拷贝 浅拷贝和深拷贝的区别及实现: 浅拷贝:一般指的是把对象的第一层拷贝到一个新对象上去,比如 let a = { count: 0, i ...

  8. 实现JS深浅拷贝的五种方式

    一.堆栈.基本数据类型.引用数据类型 在了解深浅拷贝之前,我们需得对堆栈.基本数据类型.引用数据类型有基本的了解 基本数据类型:number.string.boolean.null.undefined ...

  9. JavaScript 的 深浅 拷贝

    深浅 拷贝 所谓的 深拷贝 浅拷贝 是 对 引用 数据类型而言的 如果变量储存的数据是 基本数据类型 例如 字符串,数值,布尔值等 没有所谓的 深浅拷贝 浅拷贝所谓的 浅拷贝 只是 复制变量中存储的内 ...

最新文章

  1. js 操作vuex数据_Vuex 数据状态持久化如何处理?
  2. idea 快速定位到某一行的快捷键
  3. RobHess的SIFT源码分析:综述
  4. 2.1.1 进位计数制
  5. 自然语言处理笔记4-哈工大 关毅
  6. ansible命令参数介绍
  7. 身高2m,体重2kg,这样的数据“看上去很好”?
  8. Linux Shell脚本入门教程系列之(四)Shell注释
  9. KendoUI和wijmoUI 它们的Grid比较 20120423
  10. 二(高)阶多元微分方程数值解法(其一)
  11. linux服务端 完美世界 下载,完美世界私服教程完美服务端关于TWGM登陆问题解决...
  12. 三菱Q系列ST、结构化编程、QD77定位以及转矩模式切换案例 三菱PLC程序案例
  13. android http上传,Android HttpClient上传文件(亲测,成功)
  14. php imagick 缩略图,PHP利用imagick生成组合缩略图,imagick缩略图_PHP教程
  15. 西门子PLC S7-1200程序实例,博图版本V15,仅供电气编程者学习借鉴
  16. sticky 失效问题
  17. MacTeX新手学习笔记
  18. 支付宝小程序授权/获取用户信息
  19. 我的狗子 -业余四足机器人笔记(1)-组成简介
  20. Spring源代码分析(11)---JDBC Dao(老树发新芽)

热门文章

  1. Java面试汇总>>>初级工程师—面试1000题
  2. spring源码导入IDEA构建时报org.springframework.oxm.jaxb.test不存在问题的解决方案(spring-oxm缺少castor和jaxb)
  3. [转]Massively Multiplayer Middleware
  4. 3dmax导出glb格式_C4D与unity3D,3DMAX,AI,AE,ks之间互导
  5. 遗传算法 一个模拟自然进化过程的启发式搜索算法
  6. 中国电视走不出清宫,成都餐饮走不出传统?
  7. Vue 中引用第三方js总结
  8. 小白自学笔记——JAVA基础 1.1常用的DOS文件
  9. AD审计子策略开启报错解决办法
  10. Vue底层原理之变化侦测 —— 让对象每一个属性都变得“可侦测”(一)