关于js中深度克隆(面试被问了三次)

js中的数据类型分为两大类:原始类型和对象类型;
原始类型:数值,字符串,布尔值,null,undefined
对象类型:函数 数组
这两种类型在复制克隆的时候有很大的区别,原始类型存储的是对象的实际数据,而对象类型存储的是对象的引用地址
克隆的概念:
浅度克隆:原始类型为值传递,对象类型仍为引用传递。
深度克隆:所有元素或者属性均为完全复制,与原对象完全脱离,也就是说对于所有新对象的修改均不会反映到原对象中。
深克隆的实现
为了保证对象的所有属性都被复制到,我们必须知道如果 for 循环以后,得到的元素仍是object或者array 那么需要再次循环,直到元素是原始类型或者函数为止,为了得到元素的类型,我们定义一个通用函数,用来返回传入对象的类型。

//返回传递给他的任意对象的类
function isClass(o){
if (o === null)return 'null';
if(o===undefined)return 'undefined';
return Object.prototype.toString.call(o).slice(8,-1);//能直接返回对象的类属性
}

function deepClone(obj){
var result,oClass= isClass(obj);//确定result的类型
if (oClass==='object'){
result = {};
}else if(oClass ==="Array"){
result = [];
}else{
return obj;
}
for(key in obj){
var copy = obj[key];
if(isClass(copy)=="object"){
result[key] = arguments.callee(copy);
}else{
result[key]=obj[key];
}
}
return result;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,869评论 2 9
  • 大家对我很不熟悉吧,是的这是我的第一篇文章。 相信大家都听过“灵异事件”吧!今天我也跟大家聊聊我...
    午夜冫歌声阅读 323评论 0 1
  • 最近听了几个职场高管的分享,主题均是自我效能。确实,他们正因为在同样的工作时间里,完成了更多的事情,解决了更多的问...
    月半半儿阅读 573评论 0 1
  • 你风尘仆仆的 从长安来到塞外 回到家乡 那么多同窗来接待 一个看到你 远远的喊你名字 一个看到你 已经跑了过来 这...
    北疆牧者阅读 379评论 0 8