原文地址:低门槛彻底理解JavaScript中的深拷贝和浅拷贝
基本类型 | 引用类型 | |
---|---|---|
保存位置 | 保存在栈内存中 | 保存在堆内存中 |
保存方式 | 完全保存在内存中的一个位置 | 变量保存的是一个指针, 指针指向内存中的一个位置 |
数据 | 简单数据段 | 对象 |
具体类型 | Boolean, Null, Undefined, Number, String, Symbol |
Object, Array, Function |
基本类型和引用类型
- ECMAScript变量包含基本类型和引用类型两种数据类型
- 基本类型
- 保存在栈内存中 => 完全保存在内存中的一个位置
- 简单数据段
Boolean, Null, Undefined, Number, String, Symbol
- 引用类型
- 保存在堆内存中 => 变量保存的是一个指针,指针指向内存中的一个位置
- 对象
Object, Array, Function
深拷贝与浅拷贝的概念只存在于引用类型。
浅拷贝就是只拷贝了指针,即A浅拷贝了B,实际上A和B指向同一个内存空间。
深拷贝是拷贝了原对象的所有内容,同时将这些内容放置到另一个内存空间里。此时,如果原对象被删除了,不会影响到新对象。
深拷贝和浅拷贝
一维数据类型
- Array
arr2 = arr1.slice()
arr2 = arr1.concat([])
arr2 = Array.from(arr1)
- Object
obj2 = Object.assign({}, obj1)
obj2 = JSON.parse(JSON.stringify(obj1))
- 无法处理
undefined
,symbol
和function
,会被转为null
- 无法处理
二维及以上数据类型
- 递归
1 | function deepCopy(obj, parent = null) { |