深克隆与浅克隆的面试问题
面试官让我谈一下深克隆和浅克隆,我之前回答了B复制了A,A变了B也变了就是浅克隆,不然就是深克隆,感觉答的不是很对。请问面试官最想听到什么答案。
31
收起
正在回答 回答被采纳积分+1
1回答
好帮手慕然然
2021-11-22 11:13:02
同学你好,可以先谈一下什么是深浅克隆以及深浅克隆产生的场景,然后再进行举例说明,思路如下:
浅克隆是只克隆对象的“表层”,一般用于基本类型值的克隆(比如数字、字符串、布尔等),而深克隆是克隆对象的全貌,一般用于引用类型值的克隆(比如对象、数组等 )。
当var a=b 变量传值时,如果b是基本类型值,则内存中会产生新的副本,此时可以实现克隆;而如果b是引用类型值,内存中不会产生新的副本,只是克隆它们的引用地址,此时需要进行深克隆,才能实现真正的克隆。
接下来讲一讲如何实现深克隆,先总结一下使用递归来实现,再讲一讲具体实现思路,如果可以的话,建议手写一下实现深克隆的代码,如下:
/** * 深拷贝 * @param {Object} obj 要拷贝的对象 */ function deepClone(obj = {}){ if(typeof obj !== 'object' || obj == null){ // obj是null ,或者不是对象和数组,直接返回 return obj; } // 初始化返回结果 let result; if(obj instanceof Array){ // 判断是否是数组 result = [] }else{ restlt = {} } for(let key in obj){ // 保证key不是原型的属性 if(obj.hasOwnProperty(key)){ // 递归调用!!! result[key] = deepClone(obj[key]) } } return result; }
只要同学能把深浅克隆涉及到的知识点都讲到了,并且讲明白了就可以。
祝学习愉快!
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星