按值复制数组
将 JavaScript 中的数组复制到另一个数组时:
var arr1 = ['a','b','c'];
var arr2 = arr1;
arr2.push('d'); //Now, arr1 = ['a','b','c','d']
我意识到它指的是与 相同的数组,而不是一个新的独立数组。如何复制数组以获得两个独立的数组?arr2
arr1
将 JavaScript 中的数组复制到另一个数组时:
var arr1 = ['a','b','c'];
var arr2 = arr1;
arr2.push('d'); //Now, arr1 = ['a','b','c','d']
我意识到它指的是与 相同的数组,而不是一个新的独立数组。如何复制数组以获得两个独立的数组?arr2
arr1
使用这个:
let oldArray = [1, 2, 3, 4, 5];
let newArray = oldArray.slice();
console.log({newArray});
基本上,slice()
操作克隆数组并返回对新数组的引用。
对于引用、字符串和数字(而不是实际对象),slice()
将对象引用复制到新数组中。原始数组和新数组都引用同一对象。如果引用的对象发生更改,则这些更改对新数组和原始数组都可见。
字符串和数字等基元是不可变的,因此不可能更改字符串或数字。
在Javascript中,深度复制技术依赖于数组中的元素。让我们从这里开始。
元素可以是:文本值、文本结构或原型。
// Literal values (type1)
const booleanLiteral = true;
const numberLiteral = 1;
const stringLiteral = 'true';
// Literal structures (type2)
const arrayLiteral = [];
const objectLiteral = {};
// Prototypes (type3)
const booleanPrototype = new Bool(true);
const numberPrototype = new Number(1);
const stringPrototype = new String('true');
const arrayPrototype = new Array();
const objectPrototype = new Object(); // or `new function () {}
从这些元素中,我们可以创建三种类型的数组。
// 1) Array of literal-values (boolean, number, string)
const type1 = [ true, 1, "true" ];
// 2) Array of literal-structures (array, object)
const type2 = [ [], {} ];
// 3) Array of prototype-objects (function)
const type3 = [ function () {}, function () {} ];
根据数组中元素的类型,我们可以使用各种技术进行深度复制。
https://www.measurethat.net/Benchmarks/Show/17502/0/deep-copy-comparison
文本值数组 (type1)
、 、 和 技术可用于仅具有文本值(布尔值、数字和字符串)的深度复制数组;其中在Chrome中具有最高的性能,而在Firefox中具有最高的性能。[ ...myArray ]
myArray.splice(0)
myArray.slice()
myArray.concat()
slice()
...
文本值(type1)和文本结构(type2)
的数组 该技术可用于深度复制文本值(布尔值,数字,字符串)和文本结构(数组,对象),但不能用于原型对象。JSON.parse(JSON.stringify(myArray))
所有数组(类型 1、类型 2、类型 3)
function copy(aObject) {
// Prevent undefined objects
// if (!aObject) return aObject;
let bObject = Array.isArray(aObject) ? [] : {};
let value;
for (const key in aObject) {
// Prevent self-references to parent object
// if (Object.is(aObject[key], aObject)) continue;
value = aObject[key];
bObject[key] = (typeof value === "object") ? copy(value) : value;
}
return bObject;
}
var arr1 = ['a','b','c'];
var arr2 = arr1;
我意识到 arr2 指的是与 arr1 相同的数组,而不是一个新的独立数组。如何复制数组以获得两个独立的数组?
由于 是文本值(布尔值、数字或字符串)的数组,因此可以使用上面讨论的任何深度复制技术,其中 和传播具有最高的性能。arr1
slice()
...
arr2 = arr1.slice();
arr2 = [...arr1];
arr2 = arr1.splice(0);
arr2 = arr1.concat();
arr2 = JSON.parse(JSON.stringify(arr1));
arr2 = copy(arr1); // Custom function needed, and provided above
arr2 = _.cloneDeep(arr1); // Lo-dash.js needed
arr2 = jQuery.extend(true, [], arr1); // jQuery.js needed