var a = [], b = [];
a.push('a');
a.push('b');
a.push('c');
b = a;
b.push('d');
console.log(a);
为什么a = [“a”,“b”,“c”,“d”] ?,当b = a时如何避免这种交叉引用;我想只有2个独立的对象,独立
最后a = [“a”,“b”,“c”],b = [“a”,“b”,“c”,“d”]
答案 0 :(得分:1)
当您为b分配a时,实际上是在为a分配引用。所以对b做出的任何改变也会影响到。要做你真正想做的事,试试:
b = [].concat(a);
将制作。
的实际副本答案 1 :(得分:1)
在JS数组中也是对象(Array
对象的实例),因此JS中的这些对象是通过引用而不是按值分配的,所以当你这样做时:
b = a
b
现在通过引用分配给a
,因此会影响a
数组。
要做你想做的事,你可以这样做:
b = a.slice();
以下是一个例子:
var a = [], b = [];
a.push('a');
a.push('b');
a.push('c');
b = a.slice();
b.push('d');
console.log(a);
<强>结果:强>
[a, b, c]
答案 2 :(得分:0)
因为变量引用了对象,所以它们不会复制它们。
您可以使用
var a = [], b = [];
a.push('a');
a.push('b');
a.push('c');
b = a.slice();
b.push('d');
console.log(a);
答案 3 :(得分:0)
因为赋值不会复制变量内容。 (参见相关的Is this a variable scoping bug in NodeJS or do I just need more sleep问题。)
对于数组,您可以使用concat
创建(浅)复制的数组:
a = [1,2,3]
b = [].concat(a)
b.push(4)
...或slice
正如其他答案所说的那样。
答案 4 :(得分:0)
执行b = a
后,a
和b
指向内存中的同一个数组;您需要分别将元素推送到a
和b
,或者将元素推送到a
后,您可以遍历它并将其推送到b
,例如< / p>
for ( var i = 0; i < a.length; i++ ){ b.push( a[i] ); }