我对以下内容感到困惑:
var foo = [100, 2],
bar = foo;
bar[0] = 9;
console.log(foo[0], bar[0]); // returns => 9, 9
我理解当bar[0]
被设置为9时,它会返回这个值 - 但是foo[0]
为什么返回9而不是100呢?
看起来foo
变成了bar
,因此赋值是从右向左进行的,而不是从左向右进行的。
我对以下内容感到困惑:
var foo = [100, 2],
bar = foo;
bar[0] = 9;
console.log(foo[0], bar[0]); // returns => 9, 9
我理解当bar[0]
被设置为9时,它会返回这个值 - 但是foo[0]
为什么返回9而不是100呢?
看起来foo
变成了bar
,因此赋值是从右向左进行的,而不是从左向右进行的。
这里的foo
和bar
都指向内存中相同的位置。实际的数组在变量之间共享,因此它们都访问/更新同一个数组。
非基本数据类型不是按值传递的,而是按引用传递。
_______ _______
| foo | --> [...] <-- | bar |
| | | |
------- -------
要复制数组,请使用 slice
。
var bar = foo.slice();
foo
被引用赋值给 bar
变量。如果你想按值赋值,请使用:
bar = foo.splice(0);
由于您将foo变量分配给bar,并且两者共享相同的内存位置,因此结果相同。
bar = foo;
创建一个对foo
的引用,而不是完全的复制。如果你需要foo
的副本,你可以使用.slice
-bar = foo.slice()
。 - Oleksandr T.bar
存储了foo
的引用,因此如果更改bar
,则foo
也会更改... 如果您不希望它们被更改,则使用元素的深拷贝! - Rayon