一、 const originalArray = [1, 2, 3];
const newArray = originalArray;
直接使用等于号赋值数组实际上是将原始数组的引用赋给新的数组,而不是创建一个新的数组。这意味着原始数组和新数组实际上指向了同一个内存地址,因此对新数组的修改也会反映在原始数组上
二、const originalArray = [1, 2, 3];
const newArray = [...originalArray];
扩展运算符(...)可以用于将一个数组展开,创建一个新的数组。使用扩展运算符可以实现浅复制,即创建一个新的数组,但是新数组中的元素仍然是原始数组中的引用。这意味着对新数组中的对象或数组的修改仍然会影响到原始数组。
三、const originalArray = [1, 2, 3];
const newArray = Array.from(originalArray);
Array.from()方法可以将一个类数组对象或可迭代对象转换为一个新的数组。它也可以用于复制一个数组并创建一个新的数组。与扩展运算符类似,Array.from()方法也是实现浅复制。新数组中的元素仍然是原始数组中的引用,因此对新数组中的对象或数组的修改仍然会影响到原始数组。
四、const originalArray = [1, 2, 3];
const newArray = originalArray.slice();
Array.prototype.slice()方法可以用于从一个数组中创建一个新的数组。传递空参数给slice方法将返回一个与原始数组相同的浅拷贝。与扩展运算符和Array.from()方法类似,slice方法也是实现浅复制。新数组中的元素仍然是原始数组中的引用,因此对新数组中的对象或数组的修改仍然会影响到原始数组。
综上所述,扩展运算符、Array.from()方法和Array.prototype.slice()方法都可以用于复制一个数组,但它们都是实现浅复制的,新数组中的元素仍然是原始数组中的引用。如果需要进行深复制,即创建一个完全独立的新数组,可以使用lodash-es中的cloneDeep函数,或者它能够递归地复制数组或者JSON序列化,JSON.parse(JSON.stringify(originalArray));但是需要注意的是,使用JSON.stringify()和JSON.parse()的方式有一些限制,比如无法处理函数、正则表达式等特殊类型的属性。而使用lodash的cloneDeep()方法可以处理更多类型的属性,同时也更为灵活和可靠。
import { cloneDeep } from 'lodash-es';
const originalArray = [{ name: 'John', age: 11 }, { name: 'Jane', age: 22 }];
const clonedArray = cloneDeep(originalArray);
clonedArray[0].name = 'Mike';
console.log(originalArray); // [{ name: 'John', age: 11 }, { name: 'Jane', age: 22}]
console.log(clonedArray); // [{ name: 'Mike', age: 11}, { name: 'Jane', age: 22}]