返回
浅拷贝和深拷贝的简单理解
前端
2023-11-30 13:44:21
浅拷贝:
在浅拷贝中,变量或对象的引用被复制到新的变量或对象中,但是引用的值不会被复制。这意味着对新变量或对象的更改不会影响原始变量或对象。
浅拷贝的实现方式:
- 基本数据类型: 对于基本数据类型,如数字、字符串和布尔值,浅拷贝就是将基本类型的值赋给新对象。例如:
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
。这是因为num1
和num2
只是保存了相同的值,而不是引用同一个内存地址。
- 引用数据类型: 对于引用数据类型,如数组、对象和函数,浅拷贝就是将其内存中的引用赋值给新对象。这意味着新对象将指向与原始对象相同的内存地址。对新对象所做的任何更改都会影响原始对象。例如:
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
。这是因为arr1
和arr2
都指向了同一个内存地址。
深拷贝:
在深拷贝中,变量或对象的引用和值都会被复制到新的变量或对象中。这意味着对新变量或对象的更改不会影响原始变量或对象。
深拷贝的实现方式:
-
基本数据类型: 对于基本数据类型,深拷贝就是将基本类型的值赋给新对象。与浅拷贝相同。
-
引用数据类型: 对于引用数据类型,深拷贝需要遍历对象或数组的每个元素,并为每个元素创建一个新的副本。例如:
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
。这是因为arr2
是arr1
的深拷贝,它们指向不同的内存地址。
浅拷贝和深拷贝的比较:
特点 | 浅拷贝 | 深拷贝 |
---|---|---|
拷贝方式 | 仅复制变量或对象的引用 | 复制变量或对象的引用和值 |
更改影响 | 对新变量或对象的更改会影响原始变量或对象 | 对新变量或对象的更改不会影响原始变量或对象 |
实现方式 | 基本数据类型:将值赋给新对象;引用数据类型:将引用赋值给新对象 | 基本数据类型:将值赋给新对象;引用数据类型:遍历并创建新副本 |
用途 | 当不需要修改原始对象或数组时 | 当需要修改对象或数组的副本而又不影响原始对象或数组时 |
结语:
浅拷贝和深拷贝是JavaScript中两种常用的拷贝方式。它们各有优缺点,在不同的场景下有不同的应用。开发者需要根据具体需求选择合适的拷贝方式。