猿问

递归实现拷贝

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 这个数组吗 不是很能理解复制的原理 求解


有只小跳蛙
浏览 524回答 1
1回答

慕容3067478

newObj怎么是数组呢,这不是一个对象么?newObj[attr]是指newObj上的一个属性,[]不是数组啊。首先,cloneObject这个函数的参数src是应该是一个对象对吧,不是对象就直接返回了。假如是对象的话,我们要做的,就是把传入的对象深拷贝一份,将深拷贝的对象return出来,这是这个函数的作用。这个理解对吧。然后就牵扯到递归遍历了,假如src上的一个属性也是对象,那么这个对象就也需要遍历,也就是再调用cloneObject这个函数。前边说了,这个函数就是传进去一个对象,再把深拷贝的对象return出来。既然src上的这个属性是对象,那么就把这个属性传进去,将返回的对象赋值给外边newObj对象的attr属性,attr是形参,根据属性名不同会变。这就是再次调用cloneObject的原因了。假如src上的属性是对象,这个对象的一个属性又是对象,那就在第二次调用的cloneObject里再调用第三次cloneObject,将return出的对象赋值给第二次cloneObject里的newObj,第二次的最终还会赋值给第一次cloneObject里的newObj,实现递归。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答