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

关于递归复制对象代码的疑问

关于递归复制对象代码的疑问

慕田峪9158850 2018-11-21 15:23:51
// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝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);
查看完整描述

1 回答

?
LEATH

TA贡献1936条经验 获得超7个赞

  1. 判断当前obj是对象还是数组,如果是数组,则 result 也是数组,否则 result 是普通对象

  2. 你的理解错了,这句的意思是如果 obj 存在,并且是对象

  3. 如果不是引用类型(对象),则说明当前键的值是基础类型,则直接将对应新的 result 对应的 key 也设置为这个值就可以了

by the way. 因为深拷贝一个对象有可能会造成内存泄漏问题。因为 key 有可能引用一个类型,从而在内部引用自身造成内存泄漏,所以深拷贝在遇到引用类型的 key 时会仅仅把 heap 内存的地址进行复制。

而且题目中第一行通过判断 splice 来判断是数组还是对象是不严谨的,万一对象下有个叫 splice 的属性刚好是函数呢,Array.isArray 方法的支持度很好,可以换成这个。

ES6的话直接 Object.assign() 就好


查看完整回答
反对 回复 2018-12-11
  • 1 回答
  • 0 关注
  • 431 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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