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

Har*_*ish 8 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
Run Code Online (Sandbox Code Playgroud)

通过上面的输入,当我修改数组时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]]
Run Code Online (Sandbox Code Playgroud)

但是当我在下面做的时候,它会发生变异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]]
Run Code Online (Sandbox Code Playgroud)

为什么会这样?使用改变数组的数组方法会发生此行为.

nnn*_*nnn 14

.concat()做一个浅的副本.所以行后:

var c = [].concat(a);
Run Code Online (Sandbox Code Playgroud)

ca引用不同的阵列,但c[0]b[0]a[0]所有引用相同的阵列.

引自MDN:

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