将数组分配给另一个变量时,将传递引用而不是值.当您使用==运算符比较两个数组并且它返回时,会确认这一点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)
c和a引用不同的阵列,但c[0]和b[0]与a[0]所有引用相同的阵列.
引自MDN:
concat将对象引用复制到新数组中.原始数组和新数组都引用相同的对象.也就是说,如果修改了引用的对象,则对新的和原始数组都可以看到更改.
| 归档时间: |
|
| 查看次数: |
240 次 |
| 最近记录: |