JavaScript 深拷贝

基本类型和引用类型

基本类型:

  • null
  • undefined
  • string
  • number
  • boolean
  • symbo

引用类型:

  • object

区别:

  • 基本类型的变量是存放在栈内存(Stack)里的,引用类型的值是保存在堆内存(Heap)
  • 基本数据类型的值是按值访问的,引用类型的值是按引用访问的
  • 基本类型的比较是它们的值的比较,引用类型的比较是引用的比较

对象引用详解

let a = { x: 1 };
let b = a;
a = a.x = { x: 1 };

console.log(a); // {x:1}
console.log(b); // {x:{x:1}}

分析

let a = { x: 1 };
let b = a;
a.x = { x: 1 };
a = a.x;

手写深拷贝

因为 js 对象类型是引用类型,所以递归的拷贝每一层直到基本类型。

对于 RegExp、Date 内置对象,调用相应构造函数创建。

/**
 * 深拷贝
 * @param {*} obj
 */
function deepClone(obj) {
  const type = Object.prototype.toString.call(obj);
  if (type.includes('Null')) return null;
  if (type.includes('RegExp')) return new RegExp(obj);
  if (type.includes('Date')) return new Date(obj);
  if (typeof obj !== 'object') return obj;

  const cloneObj = new obj.constructor();
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      cloneObj[key] = deepClone(obj[key]);
    }
  }
  return cloneObj;
}

const obj = {
  a: undefined,
  b: null,
  c: /\d+/g,
  d: () => {},
  e: 1,
  f: 'hello world',
  g: { name: '小豪' },
  h: [1, 2, 3],
};
const cloneObj = deepClone(obj);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、如何区分深拷贝和浅拷贝? 假设B复制了A,当修改A时,看B是否发生变化,如果B也跟着变了,说明这是浅拷贝,拿人...
    Adonia汪阅读 2,118评论 0 0
  • JavaScript----深拷贝、浅拷贝 为说清楚二者使用过程中的区别,首先介绍一些JavaScript的基本知...
    扮猪老虎吃阅读 2,600评论 0 0
  • 数据类型和堆栈的关系 基本类型:undefined null Boolean Bumber String Symb...
    kjkongjun阅读 1,924评论 0 0
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,900评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 11,278评论 0 4