为了账号安全,请及时绑定邮箱和手机立即绑定

递归实现拷贝

递归实现拷贝

有只小跳蛙 2018-12-26 22:18:41
function cloneObject (src) {var newObj = {}if (typeof (src) !== 'object') {  return src;}else{   for (var attr in src) {     newObj[attr] = cloneObject(src[attr]);   }}return newObj;}这里面的newObj[attr]=cloneObject(src[attr]) 是递归这我知道 但是这步的原理我没看明白 是把src[attr]复制给newObj 这个数组吗 不是很能理解复制的原理 求解
查看完整描述

1 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

newObj怎么是数组呢,这不是一个对象么?newObj[attr]是指newObj上的一个属性,[]不是数组啊。

首先,cloneObject这个函数的参数src是应该是一个对象对吧,不是对象就直接返回了。假如是对象的话,我们要做的,就是把传入的对象深拷贝一份,将深拷贝的对象return出来,这是这个函数的作用。这个理解对吧。

然后就牵扯到递归遍历了,假如src上的一个属性也是对象,那么这个对象就也需要遍历,也就是再调用cloneObject这个函数。

前边说了,这个函数就是传进去一个对象再把深拷贝的对象return出来。既然src上的这个属性是对象,那么就把这个属性传进去,将返回的对象赋值给外边newObj对象的attr属性,attr是形参,根据属性名不同会变。

这就是再次调用cloneObject的原因了。

假如src上的属性是对象,这个对象的一个属性又是对象,那就在第二次调用的cloneObject里再调用第三次cloneObject,将return出的对象赋值给第二次cloneObject里的newObj,第二次的最终还会赋值给第一次cloneObject里的newObj,实现递归。


查看完整回答
反对 回复 2019-01-25
  • 1 回答
  • 0 关注
  • 523 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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