将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 a = [1,2,3];
现在,您可以执行以下任一操作来创建阵列的副本。
let b = Array.from(a);
OR
let b = [...a];
OR
let b = new Array(...a);
OR
let b = a.slice();
OR
let b = a.map(e => e);
现在,如果我改变一个,
a.push(5);
那么,a是[1,2,3,5],但b仍然是[1,3,3],因为它有不同的引用。
但我认为,在上述所有方法中,Array.from都更好,并且主要用于复制数组。
其他回答
使用jQuery深度复制可以如下所示:
var arr2 = $.extend(true, [], arr1);
let a = [1,2,3];
现在,您可以执行以下任一操作来创建阵列的副本。
let b = Array.from(a);
OR
let b = [...a];
OR
let b = new Array(...a);
OR
let b = a.slice();
OR
let b = a.map(e => e);
现在,如果我改变一个,
a.push(5);
那么,a是[1,2,3,5],但b仍然是[1,3,3],因为它有不同的引用。
但我认为,在上述所有方法中,Array.from都更好,并且主要用于复制数组。
我个人更喜欢这种方式:
JSON.parse(JSON.stringify( originalObject ));
基本体值始终按其值传递(复制)。但是,复合值是通过引用传递的。
那么我们如何复制这个arr?
let arr = [1,2,3,4,5];
在ES6中复制阵列
let arrCopy = [...arr];
在ES5中复制n阵列
let arrCopy = arr.slice();
let arrCopy = [].concat(arr);
为什么“let arrCopy=arr”不按值传递?
将一个变量传递给另一个复合值(例如“对象/数组”)会有不同的行为。在共和值上使用sign运算符,我们将引用传递给对象。这就是为什么在删除/添加arr元素时,两个数组的值都会发生变化。
例外情况:
arrCopy[1] = 'adding new value this way will unreference';
为变量指定新值时,将更改引用本身,而不会影响原始对象/数组。
阅读更多信息
您可以将ES6与spread Opartor一起使用,它更简单。
arr2 = [...arr1];
有一些限制。。check docs Spread语法@mozilla