浅拷贝和深拷贝

2022-12-19 0 407

浅复本

let arr = [ { name: lilei, age: 18 }, { name: hanmeimei, age: 19 } ] //六种同时实现浅复本的方式 let aCope = Object.assign([], arr) let aCope = […arr] let aCope = Object.fromEntries(Object.entries(arr)) let aCope = Object.create({}, Object.getOwnPropertyDescriptors(arr)) let aCope = Object.defineProperties({}, Object.getOwnPropertyDescriptors(arr))

浅复本原理

for (let key of Object.keys(arr)) { aCope[key] = arr[key] }

深复本

常用的简单方式

let depCope = JSON.parse(JSON.stringify(object))

弊端

1、如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式。而不是时间对象;

2、如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象;

3、如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失;

4、如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null

5、JSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深复本后,会丢弃对象的constructor;

6、如果对象中存在循环引用的情况也无法正确同时实现深复本;

简单完善的深复本方式

let obj = { name : xuxiu, arr : [1,[2,3],4], }; let depCloneObj=deepClone(obj) depCloneObj.name = “faker”; depCloneObj.arr[1] = [5,6]; function deepClone(obj) { if (obj === null) return obj; if (obj instanceof Date) return new Date(obj); if (obj instanceof RegExp) return new RegExp(obj); if (typeof obj !== “object”) return obj; let cloneObj = new obj.constructor(); for (let key in obj) { if (obj.hasOwnProperty(key)) { // 递归 cloneObj[key] = deepClone(obj[key]); } } return cloneObj; } console.log(obj,obj) // obj { name: xuxiu, arr: [ 1, [ 2, 3 ], 4 ] }console.log(depCloneObj,depCloneObj) // depCloneObj { name: faker, arr: [ 1, [ 5, 6], 4 ] }

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务