浅拷贝&深拷贝

488 阅读1分钟

一、什么是浅拷贝和深拷贝

1. 存储变量机制

  • 内存分为栈内存和堆内存,简单数据类型存储在栈内存中,复杂数据类型引用存在栈内存中,实际的值存在堆内存中,示意图如下 image.png

2. 浅拷贝&深拷贝

  • 浅拷贝:只拷贝引用,不在堆中开辟新的空间存储拷贝对象,导致两个引用指向一个内存空间,一个会受另一个的影响。
  • 深拷贝:拷贝引用,在堆中开辟新的存储空间存储拷贝对象,原对象和拷贝对象不会互相影响。

二、具体实现

1. 浅拷贝

  • 1️⃣for in、2️⃣Object.assign()、3️⃣=赋值、4️⃣解构赋值
(1)for in

image.png

(2)Object.assign()
  • assign方法是ES6新增的对象方法。
  • assign(target:目标对象, source:源对象),返回值为目标对象
    • 只传一个参数时:相当于浅拷贝目标对象
    • 传两个参数时:将目标对象上相同的属性通过源对象的属性覆盖,目标对象独有的属性保持原样 image.png
(3)=赋值
let obj = {a: '1', b: '2'};
let obj1 = obj;
(4)解构赋值
let o = {a: '1', b: '2'}
let obj = {...o}

2. 深拷贝

  • 1️⃣JSON.parse&JSON.stringify、2️⃣递归、3️⃣_.cloneDeep(value)
(1)JSON.parse&JSON.stringify
  • JSON.parse:从一个字符串中解析出json(键值对)
  • JSON.stringify:从json对象中解析出字符串 image.png
  • 存在问题:原对象的原型链丢失了,指向Object
(2)递归

image.png

(3)Lodash

_.cloneDeep(obj)