返回

浅拷贝和深拷贝的简单理解

前端

浅拷贝:

在浅拷贝中,变量或对象的引用被复制到新的变量或对象中,但是引用的值不会被复制。这意味着对新变量或对象的更改不会影响原始变量或对象。

浅拷贝的实现方式:

  • 基本数据类型: 对于基本数据类型,如数字、字符串和布尔值,浅拷贝就是将基本类型的值赋给新对象。例如:
const num1 = 10;
const num2 = num1; // 浅拷贝

console.log(num1); // 输出:10
console.log(num2); // 输出:10

num2 = 20;

console.log(num1); // 输出:10
console.log(num2); // 输出:20

在这个例子中,对变量num2的更改不会影响原始变量num1。这是因为num1num2只是保存了相同的值,而不是引用同一个内存地址。

  • 引用数据类型: 对于引用数据类型,如数组、对象和函数,浅拷贝就是将其内存中的引用赋值给新对象。这意味着新对象将指向与原始对象相同的内存地址。对新对象所做的任何更改都会影响原始对象。例如:
const arr1 = [1, 2, 3];
const arr2 = arr1; // 浅拷贝

console.log(arr1); // 输出:[1, 2, 3]
console.log(arr2); // 输出:[1, 2, 3]

arr2[0] = 4;

console.log(arr1); // 输出:[4, 2, 3]
console.log(arr2); // 输出:[4, 2, 3]

在这个例子中,对变量arr2的更改也影响了原始变量arr1。这是因为arr1arr2都指向了同一个内存地址。

深拷贝:

在深拷贝中,变量或对象的引用和值都会被复制到新的变量或对象中。这意味着对新变量或对象的更改不会影响原始变量或对象。

深拷贝的实现方式:

  • 基本数据类型: 对于基本数据类型,深拷贝就是将基本类型的值赋给新对象。与浅拷贝相同。

  • 引用数据类型: 对于引用数据类型,深拷贝需要遍历对象或数组的每个元素,并为每个元素创建一个新的副本。例如:

const arr1 = [1, 2, 3];
const arr2 = [];

for (let i = 0; i < arr1.length; i++) {
  arr2.push(arr1[i]);
}

console.log(arr1); // 输出:[1, 2, 3]
console.log(arr2); // 输出:[1, 2, 3]

arr2[0] = 4;

console.log(arr1); // 输出:[1, 2, 3]
console.log(arr2); // 输出:[4, 2, 3]

在这个例子中,对变量arr2的更改不会影响原始变量arr1。这是因为arr2arr1的深拷贝,它们指向不同的内存地址。

浅拷贝和深拷贝的比较:

特点 浅拷贝 深拷贝
拷贝方式 仅复制变量或对象的引用 复制变量或对象的引用和值
更改影响 对新变量或对象的更改会影响原始变量或对象 对新变量或对象的更改不会影响原始变量或对象
实现方式 基本数据类型:将值赋给新对象;引用数据类型:将引用赋值给新对象 基本数据类型:将值赋给新对象;引用数据类型:遍历并创建新副本
用途 当不需要修改原始对象或数组时 当需要修改对象或数组的副本而又不影响原始对象或数组时

结语:

浅拷贝和深拷贝是JavaScript中两种常用的拷贝方式。它们各有优缺点,在不同的场景下有不同的应用。开发者需要根据具体需求选择合适的拷贝方式。