在JavaScript中,数组是引用类型。这意味着当您创建一个数组时,实际上是将该数组的引用(或地址)赋值给变量,而不是数组本身的副本。以下是关于JavaScript数组地址指向的一些基础概念:
let arr1 = [1, 2, 3];
let arr2 = arr1; // arr2 现在指向与 arr1 相同的内存地址
number[]
, string[]
等。let arr1 = [1, 2, 3];
let arr2 = arr1;
arr2.push(4);
console.log(arr1); // [1, 2, 3, 4]
原因:arr1
和 arr2
指向同一个数组对象。
解决方法:使用浅拷贝或深拷贝来创建独立的数组副本。
let arr1 = [1, 2, 3];
let arr2 = [...arr1]; // 使用扩展运算符进行浅拷贝
arr2.push(4);
console.log(arr1); // [1, 2, 3]
let arr1 = [{a: 1}, {b: 2}];
let arr2 = [...arr1];
arr2[0].a = 10;
console.log(arr1); // [{a: 10}, {b: 2}]
原因:虽然数组本身是浅拷贝,但数组中的对象仍然是引用。
解决方法:使用深拷贝库(如 lodash
的 cloneDeep
方法)来完全复制数组及其嵌套对象。
const _ = require('lodash');
let arr1 = [{a: 1}, {b: 2}];
let arr2 = _.cloneDeep(arr1);
arr2[0].a = 10;
console.log(arr1); // [{a: 1}, {b: 2}]
理解JavaScript中数组的引用传递机制对于避免意外的副作用和正确管理内存至关重要。通过合理使用浅拷贝和深拷贝技术,可以有效地控制数据的独立性和一致性。