一味宠爱|第30节 检测和枚举属性-Javascript-零点程序员-王唯( 三 )
深拷贝就是无限层级拷贝;
简单的深拷贝:
function clone(obj) {var o = {};for(var i in obj){if(obj.hasOwnProperty(i)){if(typeof obj[i] === 'object'){o[i] = clone(obj[i]);}else{o[i] = obj[i];}}}return obj;}两者的区别就是使用了递归;
在做深拷贝的时候 , 还需要考虑参数的检验、判断对象的逻辑是不是严谨、数组的情况;如:
// 参数的检验function isObject(o){return Object.prototype.toString.call(o) === '[object Object]';}function clone(obj){if(!isObject(obj)) return obj;// ...}实现多级层次的拷贝 , 用的就是递归 , 但当数据的层次很深的时候就会造成栈溢出;但大部分情况下不会出现这么深层级的数据;另外还有一个致命的问题 , 就是循环引用 , 如:
var a = {};a.a = a;clone(a); // 直接死循环复杂的深拷贝:
// 深拷贝函数(支持基本数据类型、原型链、RegExp、Date类型)function deepClone(obj, parent = null) {var result;// 最后的返回结果var _parent = parent;// 防止循环引用while(_parent){if(_parent.originalParent === obj){return _parent.currentParent;}_parent = _parent.parent;}if(obj}else if(obj instanceof Date){result = new Date(obj.getTime());}else{var proto = Object.getPrototypeOf(obj);result = Object.create(proto);}for(var key in obj){// Array类型与Object类型的拷贝if(obj.hasOwnProperty(key)){if(obj[key]}else{result[key] = obj[key];}}}}else{// 返回基本数据类型与Function类型,因为Function不需要深拷贝return obj;}return result;}// 调用 functionconstruct() {this.a = 1,this.b = {x:2,y:3,z:[4,5,[6]]},this.c = [7,8,[9,10]];this.d = new Date();this.e = /abc/ig,this.f = function (a,b) {return a + b;},this.g = null,this.h = undefined,this.i = "hello",this.j = Symbol("foo")}construct.prototype.str = "I'm prototype";var obj1 = new construct();obj1.k = obj1;obj2 = deepClone(obj1);obj2.b.x = 999;obj2.c[0] = 666;console.log(obj1);console.log(obj2);console.log(obj1.str);console.log(obj2.str);无论是浅拷贝 , 还是深拷贝 , 都会带来性能问题(因为需要遍历) , 所以定义对象时最好写的浅一点;
【一味宠爱|第30节 检测和枚举属性-Javascript-零点程序员-王唯】Web前端开发之Javascript-零点程序员-王唯
推荐阅读
- 时尚@人到中年,一味扮嫩早就行不通了,这几个颜色才时尚高级
- 鬼才狗仔|蔡徐坤郑恺同时给baby递吃的,得到回应不同,还是弟弟受宠爱
- 洗米华@洗米华宠爱Mandy,生第1胎奖励大别墅,二胎就是她注定成功的筹码
- 历史很奇葩|深得慈禧宠爱,25岁落了个身首异处的下场,他10岁净身入宫
- 一味宠爱|小米发力,新机价格松动,还有骁龙765G+256GB+50倍变焦加持
- 秦汉|他是汉武帝第一个皇后,却不受汉武帝的宠爱,晚年在长门宫中终老
- 一味宠爱|共筑新零售|云徙科技荣膺阿里云新零售合作计划核心伙伴
- 一味宠爱|华为推出新系统替换谷歌GMS后!海外用户依旧不买账:销量持续大跌
- 一味宠爱|华为手机首次登上全球第一!国外机构如此评价
- 一味宠爱|男子骑共享单车遗落手包 多亏遇到了他......
