深度克隆

递归调用

function checkType (origin) {
  return Object.prototype.toString.call(origin).slice(8, -1);
}

function deepClone (origin) {
  let type = checkType(origin);
  let target;

  if (type === 'object') {
    target = {};
  } else if (type === 'array') {
    target = [];
  } else {
    return origin;
  }
  
  for (let prop in origin) {
    if (origin.hasOwnProperty(prop)) {
      if (origin[prop] !== null && typeof origin[prop] === 'object') {
        target[prop] = deepClone(origin[prop]);
      } else {
        target[prop] = origin[prop];
      }
    }
  }
  return target;
}

let a = null;
let arr = [1,2,[3,4],null,true,undefined];
let arr1 = [1,2,{user:'a'}];
let obj = {a: 1, b: 2, c: {d: [3,4]}, e: function fun(){}};
console.log(deepClone(a)); // null
console.log(deepClone(arr)); // [ 1, 2, [ 3, 4 ], null, true, undefined ]
console.log(deepClone(arr1)); // [ 1, 2, { user: 'a' } ]
console.log(deepClone(obj)); // { a: 1, b: 2, c: { d: [ 3, 4 ] }, e: [Function: fun] }

JSON.parse(JSON.stringify(obj))

被克隆的对象为 JSON 格式,即不能包括函数

const obj1 =  {a: {b: 1}};
const deepCopy = obj => JSON.parse(JSON.stringify(obj));
const obj2 = deepCopy(obj1);

obj1.a.b = 2;
obj2.a.b // 1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一:为什么要实现深度克隆? 这是一个前端面试经常问到的问题,并且在知乎上我看到很多的前端大神也都探讨过。这个问题背...
    指尖的宇宙阅读 19,680评论 0 24
  • 方法一 硬刚法(迭代法,适用于所有) 方法二 利用JSON.stringify 将js对象序列化(JSON字符串)...
    邢走在云端阅读 235评论 0 2
  • 检测数据类型的方法: 准备工作 1、typeoftypeof返回的数据类型有: String->'string'N...
    Rosa_Lv阅读 916评论 0 1
  • 是否遇到过这样的事情 let obj = {name: 'test',age: 1}_obj.age = 2con...
    O8阅读 270评论 0 0
  • 1、数据类型:* 数据分为基本的数据类型(String, Number, boolean, Null, Undef...
    牛耀阅读 305评论 0 0

友情链接更多精彩内容