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
,实现递归。
添加回答
举报
0/150
提交
取消