// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
var deepClone = function fnDeepClone(obj){
var result = typeof obj.splice === 'function'?[]:{},//如果这句注释掉,会抛出异常,这句发挥的是什么作用?
key;
if (obj && typeof obj === 'object'){//这句怎么理解?如果obj是对象,typeof obj一定是对象啊。
for (key in obj ){
if (obj[key] && typeof obj[key] === 'object'){
result[key] = fnDeepClone(obj[key]);
}else{
result[key] = obj[key];//这句怎么理解?复制的不是值,而是键值对?
}
}
return result;
}
return obj;
}
var arr=[2,3,[6,7]];
var brr=deepClone(arr);
console.log(brr);
判断当前obj是对象还是数组,如果是数组,则 result 也是数组,否则 result 是普通对象
你的理解错了,这句的意思是如果 obj 存在,并且是对象
如果不是引用类型(对象),则说明当前键的值是基础类型,则直接将对应新的 result 对应的 key 也设置为这个值就可以了
by the way. 因为深拷贝一个对象有可能会造成内存泄漏问题。因为 key 有可能引用一个类型,从而在内部引用自身造成内存泄漏,所以深拷贝在遇到引用类型的 key 时会仅仅把 heap 内存的地址进行复制。
而且题目中第一行通过判断
splice
来判断是数组还是对象是不严谨的,万一对象下有个叫 splice 的属性刚好是函数呢,Array.isArray 方法的支持度很好,可以换成这个。ES6的话直接
Object.assign()
就好