理解数组时我错过了什么?

时间:2015-05-30 08:19:00

标签: javascript

将数组分配给另一个变量时,将传递引用而不是值。使用==运算符比较两个数组时会确认这一点,并返回true

var a = [[1,2],[3,4],[5,6]];
var b = a; // b = [[1,2],[3,4],[5,6]]
var c = [].concat(a); // c = [[1,2],[3,4],[5,6]]

a == b; //true
a == c; //false

使用上述输入,当我修改数组b时,它会改变数组a,但不会改变c

b.push([7,8]); // b = [[1,2],[3,4],[5,6], [7,8]]
a; //a = [[1,2],[3,4],[5,6], [7,8]]
c; //c = [[1,2],[3,4],[5,6]]

但是,当我执行以下操作时,它会改变c

b[0].push(5); // b = [[1,2,5],[3,4],[5,6], [7,8]]
a; //a = [[1,2,5],[3,4],[5,6], [7,8]]
c; //c = [[1,2,5],[3,4],[5,6]]

为什么会这样?使用改变数组的数组方法会发生这种情况。

1 个答案:

答案 0 :(得分:14)

.concat()执行浅拷贝。在行之后:

var c = [].concat(a);

ca引用了不同的数组,但c[0]b[0]以及a[0]都引用了相同的数组。

引自MDN

  

concat将对象引用复制到新数组中。原始数组和新数组都引用相同的对象。也就是说,如果修改了引用的对象,则新的和原始数组都可以看到更改。