• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

js深拷贝递归实现

武飞扬头像
富士山下学Java
帮助1


通过递归可以简单实现对象的深度克隆,但是这种方法不管是ES6还是ES5实现,都有同样的缺陷,就是只能实现特定的object的深度复制(比如数组和函数),不能实现包装对象Number,String , Boolean,以及Date对象,RegExp对象的复制。

下面是完美版的深拷贝

参考自:[https://blog.csdn.net/liwusen/article/details/78759373](()

function istype(obj,type){//判断包装类型的原型

return Object.prototype.toString.call(obj).indexOf 《大厂前端面试题解析 Web核心总结学习笔记 企业项目实战源码 最新高清讲解视频》无偿开源 徽信搜索公众号【编程进阶路】 (type)!=-1

}

const deepClone =(initalObj) =>

{

if (typeof initalObj !== ‘object’) {//如果是基本类型直接返回值

return initalObj

}

if(istype(initalObj,‘String’)||istype(initalObj,‘Number’)||istype(initalObj,‘Boolean’))

return initalObj.valueOf();

if(istype(initalObj,‘Date’))

return new Date(initalObj.valueOf());

if(istype(initalObj,‘RegExp’)){

let pattern = initalObj.valueOf();

let flags = ‘’;

flags = pattern.global ? ‘g’ : ‘’;

flags = pattern.ignoreCase ? ‘i’ : ‘’;

flags = pattern.multiline ? ‘m’ : ‘’;

return new RegExp(pattern, flags);

}

const obj = Array.isArray(initalObj)?[]:{};//可能是对象或者数组

for (const key in initalObj) {

if (typeof initalObj[key] === ‘object’) {//对于对象元素,deepclone

//递归返回新的对象

obj[key] = deepClone(initalObj[key]);

} else if (typeof initalObj[key] === ‘function’) {//对于函数,用bind拷贝

//返回新函数

obj[key] = initalObj[key].bind(obj);

} else {

//基本类型直接返回

obj[key] = initalObj[key];

}

}

return obj;

}

测试

const obj = {

a: 1,

b: {b1:[],b2:[]},

c: { d: {}, g: () => {} },

e: () => {},

f: function() {}

}

const newObj = deepClone(obj);

console.log(newObj.a === obj.a);

console.log(newObj.b === obj.b);

console.log(newObj.c === obj.c);

console.log(newObj.c.d === obj.c.d);

console.log(newObj.c.g === obj.c.g);

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggfaac
系列文章
更多 icon
同类精品
更多 icon
继续加载