返回

从数据类型和堆栈内存的角度了解浅拷贝与深拷贝

前端

一、基本类型和引用类型

在 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 对象。通过这种方式,我们可以实现深拷贝。

浅拷贝与深拷贝的应用场景

浅拷贝和深拷贝在不同的场景下都有其应用价值。

  • 浅拷贝 通常用于需要节省内存空间的情况,例如,当我们只需要复制引用类型变量本身而不关心它所指向的数据时。
  • 深拷贝 通常用于需要确保原始变量中的数据不受影响的情况,例如,当我们希望对引用类型变量进行修改而又不影响原始变量时。

希望本文对您理解浅拷贝和深拷贝有所帮助。