result.push(deepClone(arr[i]))这里有个疑问

result.push(deepClone(arr[i]))这里有个疑问

当[77,88]再传入到deepClone方法中,再经历一遍for循环,那if语句里的如果不是数组result.push(arr[i]);不是已经写了会把数组中的数组里的数推入result了嘛,觉得第一层的result.push(deepClone(arr[i]))的result.push不用写,这个理解对嘛?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
好帮手慕夭夭 2020-12-30 12:19:29

同学你好,因为需要把本次调用返回的结果数组,添加到上一次调用的结果数组中。具体参考如下:

1、第一次调用deepClone时,创建result = [],循环遍历[33, 44, 11, 22, [77, 88, [33, 44]]] 。依次把33, 44, 11, 22加入到数组中,即result=[33, 44, 11, 22]。等遍历到最后一个元素,发现是数组。那么执行result.push(deepClone(arr[i])),里面调用了函数deepClone,所以需要等待第二次调用结束,第一次调用deepClone才会继续往下执行代码。


2、第二次调用,创建result = [],遍历 [33, 44],发现它里面没有数组,执行else中的result.push(arr[i]),此时result=[33, 44] 。即第二次调用deepClone返回值为[33, 44],第二次调用返回结果数组为result = [33, 44]。


3、上面说了,第二次调用结束,才会继续执行第一次的调用,即第二次deepClone(arr[i])的返回值[33, 44],被添加到了第一次创建的result 中。注意第一次的result=[33, 44, 11, 22],所以result.push(deepClone(arr[i]));执行之后,result=[33, 44, 11, 22, [77, 88, [33, 44]]];

如下相当于 result.push([33, 44]);


http://img1.sycdn.imooc.com//climg/5febfee0096a988c05120142.jpg

最后第一次调用返回结果数组为[33, 44, 11, 22, [77, 88, [33, 44]]]。

把上面的内容多看几遍,多理解一下哦。

祝学习愉快~


慕粉0644535011 提问者 2020-12-30 10:30:04

抱歉老师,忘记贴图了,是下面划线的这个
http://img1.sycdn.imooc.com//5febe5f900017b7511100614.jpg

好帮手慕夭夭 2020-12-30 10:12:25

同学你好,是说的如下圈出的代码不用写吗?肯定不行的,如果再次执行deepClone函数时,if判断数组[77,88]中已经不包含数组了,那么就需要执行else把数组[77,88]中的元素添加到result中。如果把result.push去掉,不仅数组第一层元素无法添加到result了,后续再次调用deepClone,里面的元素全都无法添加到result中了。

http://img1.sycdn.imooc.com//climg/5febe04009277e8311100614.jpg

如果说的不是这个,请详细描述一下问题,以便老师为你解答。另外,可以按照自己的想法写代码实现,看看什么效果,自己思考弄懂的知识会理解的更加深刻哦。

祝学习愉快~


  • 提问者 慕粉0644535011 #1
    老师是我上面写错了,这里不能贴图,我这里面回答里面了,不明白那里为什么还要push一遍
    2020-12-30 10:34:38
  • 提问者 慕粉0644535011 #2
    老师,我不太明白if(Array.isArray){ result.push(deepClone(arr[i]))}里面为什么还要写result.push,当第二层数组经过if判断,从else过的时候不是已经push进resul了吗?
    2020-12-30 11:32:16
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师