简单的Javascript数组问题

时间:2012-03-07 10:36:58

标签: javascript arrays

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”]

5 个答案:

答案 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后,ab指向内存中的同一个数组;您需要分别将元素推送到ab,或者将元素推送到a后,您可以遍历它并将其推送到b,例如< / p>

for ( var i = 0; i < a.length; i++ ){ b.push( a[i] ); }