当前位置: 首页 > Web前端 > JavaScript

JOSN.parse(JSON.stringify())实现深拷贝的缺点

时间:2023-03-27 01:17:47 JavaScript

首先推荐使用项目中lodash第三方工具库的cloneDeep方法进行数据的深拷贝。//import{cloneDeep}from'lodash';importcloneDeepfrom'lodash/cloneDeep';//只引用一个建议这样写leta=cloneDeep({});案例数据varobj={name:'zhangsan',date:newDate(),regExp:newRegExp("\w+"),fun:function(){returntrue;},err:newError('error'),symbol:Symbol(233),undefined:undefined,null:null,nan:NaN,infinity:Infinity//infinity};1.两次打印结果console.log(obj);//正常console.log(JOSN.parse(JSON.stringify(obj)));//部分数据丢失或转义3.深拷贝循环引用对象会出错(lodash可以深拷贝)vara={};a.b=a;控制台日志(一);//内存指向无限互引用但不会内存溢出console.log(JOSN.parse(JSON.stringify(a)));//直接报错4.如果声明的obj中有properties是new构造函数生成的,使用JSON.parse(JSON.afterstringify(xxx))深拷贝,对应的构造函数初始化构造函数会被丢弃;functionnewFun(name){this.name=name;}letzhangsan=newnewFun('张三');letnewObj={name:'刘十三000',date:zhangsan}letlisi=JSON.parse(JSON.stringify(newObj));console.log('__',newObj,lisi);5.总结JOSN.parse(JSON.stringify())的深拷贝模式1.TimenewDate()2.regularitynewRegExp()3.Function函数4.newError对象5.Symbol()6.undefined7.NaN8.Infinityinfinity9.BigInt(1)or111111n这种bigint数据类型直接报错(补充点)会有不同程度的丢失和变化varobj={name:'zhangsan',date:newDate(),//转义为字符regExp:newRegExp("\w+"),//lostfun:function(){returntrue;},//丢失err:newError('error'),//丢失符号:Symbol(233),//丢失undefined:undefined,//丢失null:null,nan:NaN,//转义nullinfinity:Infinity//infiniteEscapednull//bigint:BigInt(1)//Bigint类型直接报错TypeError:DonotknowhowtoserializeaBigInt};PS:仅用于深拷贝纯数据,当然可以使用JOSN.parse(JSON.stringify(xxx))但是为了提高自己的代码质量,请严格。