我正在制作一个包含2个阵列的游戏,但是当我不想要它时,一个阵列会发生变化。浏览器中控制台的示例:
A=[1,2,3,4,5]
B=[6,7,8,9,10]
A=B
A.push(11)
A =[6, 7, 8, 9, 10, 11]
B =[6, 7, 8, 9, 10, 11]
A很好,但有办法让B留[6,7,8,9,10]
答案 0 :(得分:6)
将展开式语法用作A=[...B];
,将B
复制到A
。与A=B
时一样,您实际上将B
的引用设置为A
,因此A
的所有更改都会导致B
的更改,反之亦然。
var A=[1,2,3,4,5];
var B=[6,7,8,9,10];
A=[...B];
A.push(11);
console.log(A);
console.log(B);
答案 1 :(得分:6)
当你这样做时
A=B
您正在A
引用B
指向的相同数组。因此,无论您使用哪个变量来查看它们所引用的数组,您都会看到对该数组所做的任何更改。
A很好但是有办法让B留下[6,7,8,9,10]
听起来您希望将<{1}}的内容复制到B
。为此,您可以使用A
:
slice
或者,在现代环境中,您可以使用ES2015的扩展表示法as Ankit pointed out。
最初不需要为A = B.slice();
分配任何内容,因为您从不使用它。
示例:
A
var A;
var B = [6,7,8,9,10];
A = B.slice();
A.push(11)
console.log(A); // [6, 7, 8, 9, 10, 11]
console.log(B); // [6, 7, 8, 9, 10]
答案 2 :(得分:2)
A=[1,2,3,4,5]
B=[6,7,8,9,10]
以下是将数组复制到其他
的三种方法 A = JSON.parse(JSON.stringify(B));
或
A = [].concat(B);
或
A= [...B]; //for ES6
A.push(11);
/*
A =[6, 7, 8, 9, 10, 11]
B =[6, 7, 8, 9, 10]
*/
答案 3 :(得分:1)
按GW_HWNDNEXT
,您为变量A=B
分配A
的相同引用,这意味着任何一个变量的任何变化都会反映在另一个中,因为它们都共享相同参考
您可以使用 Spread Operator 来创建数组的副本
B
<强>捕捉强>
请注意,如果值是对象,则对象仍将继续共享相同的引用。
let A = [1,2,3,4,5], B = [6,7,8,9,10];
A=[...B];
A.push(11);
console.log(A); // [6,7,8,9,10, 11]
console.log(B); // [6,7,8,9,10]
答案 4 :(得分:1)
阅读上面的评论。然后:
var a = [1, 2, 3, 4, 5], b = [6, 7, 8, 9, 10];
a = b.slice(); a.push(11);
console.log('a', a); console.log('b', b);
&#13;
答案 5 :(得分:0)
通过分配A=B
,两个变量都指向同一个数组,因此通过另一个变量可以看到它。如果您希望A
和B
引用两个不同的数组,则可以复制它而不是仅仅分配。 E.g:
B = A.slice(0);