返回
从数据类型和堆栈内存的角度了解浅拷贝与深拷贝
前端
2023-11-04 13:42:50
一、基本类型和引用类型
在 JavaScript 中,变量可以存储两种类型的数据:基本类型和引用类型。
基本类型 包括:
- 字符串
- 数字
- 布尔值
- undefined
- null
引用类型 包括:
- 对象
- 数组
- 函数
基本类型的值存储在栈内存中,而引用类型的值存储在堆内存中。
二、栈内存和堆内存
栈内存 (stack)是一种先进后出的(LIFO)内存管理方式。这意味着最后进入栈内存的数据将首先被删除。栈内存通常用于存储基本类型的值和局部变量。
堆内存 (heap)是一种动态内存管理方式。这意味着可以随时分配和释放内存空间。堆内存通常用于存储引用类型的值和全局变量。
堆栈内存之间的联系
当我们声明一个引用类型变量时,该变量将在堆内存中创建一个内存空间。然后,变量本身将在栈内存中存储指向该内存空间的指针。这意味着当我们访问一个引用类型变量时,实际上是访问了堆内存中的数据。
三、浅拷贝与深拷贝
浅拷贝 是指只复制引用类型变量本身,而不复制它所指向的内存空间中的数据。这意味着如果我们对浅拷贝后的变量进行修改,原始变量中的数据也会随之改变。
深拷贝 是指不仅复制引用类型变量本身,还复制它所指向的内存空间中的数据。这意味着如果我们对深拷贝后的变量进行修改,原始变量中的数据不会受到影响。
浅拷贝和深拷贝的实现
在 JavaScript 中,可以使用以下方法实现浅拷贝和深拷贝:
- 浅拷贝 :
let obj1 = {
name: 'John',
age: 30
};
let obj2 = obj1;
- 深拷贝 :
let obj1 = {
name: 'John',
age: 30
};
let obj2 = JSON.parse(JSON.stringify(obj1));
JSON.stringify() 函数可以将 JavaScript 对象转换为 JSON 字符串,而 JSON.parse() 函数可以将 JSON 字符串转换为 JavaScript 对象。通过这种方式,我们可以实现深拷贝。
浅拷贝与深拷贝的应用场景
浅拷贝和深拷贝在不同的场景下都有其应用价值。
- 浅拷贝 通常用于需要节省内存空间的情况,例如,当我们只需要复制引用类型变量本身而不关心它所指向的数据时。
- 深拷贝 通常用于需要确保原始变量中的数据不受影响的情况,例如,当我们希望对引用类型变量进行修改而又不影响原始变量时。
希望本文对您理解浅拷贝和深拷贝有所帮助。