我尝试了以下代码
var foo = [1,2];
var bar = foo;
bar[0] = 9;
console.log(foo[0],bar[0]); //the result is 9,9
如何foo [0]可以是9?请告诉我这个被卡住了。谢谢。
答案 0 :(得分:3)
在javascript中,数组通过引用传递。这意味着bar
是指向foo
指向的同一对象的指针。
如果要通过传递其值来分配变量,则需要添加clone
方法,如下面的代码
var foo = [1,2];
var bar = foo.clone();
bar[0] = 9;
console.log(foo[0],bar[0]); //the result is 1,9
答案 1 :(得分:1)
foo
成为一个数组。bar
成为对foo
bar
将真正改变foo
现在foo
是bar
...反之亦然
答案 2 :(得分:1)
数组和对象和函数是javascript中的引用,而数字和字符串是值。因此,当你这样做:
var foo = [];
var bar = foo;
变量bar
现在指向foo
,foo
和bar
都指向相同的数组。
如果要复制数组,请使用Array.prototype.slice()
:
var bar = foo.slice();
从技术上讲,.slice()
方法用于返回数组的子数组,但如果在没有任何参数的情况下调用它,则返回整个数组。要意识到的重要一点是.slice()
返回一个新数组,而不是原始数组。这就是为什么我们用它来做一个数组的浅表副本。
对于对象,您可以使用Objcet.create()
功能:
var foo = {};
var bar = Object.create(foo);
应该注意,.slice()
和Object.create()
都会创建原始的浅拷贝。也就是说,如果数组或对象包含其他数组或对象,则内容仍为引用:
var foo = [[1,2],3];
var bar = foo.slice();
bar[1] = 100;
console.log(bar[1]); // 100
console.log(foo[1]); // 3
bar[0][0] = 200;
console.log(bar[0][0]); // 200
console.log(foo[0][0]); // also 200
如果要执行深层复制,则需要编写递归函数以基于原始构建另一个数组/对象。或者,如果您不介意暂时浪费一些RAM,可以将它们转换为JSON并再次转发:
var bar = JSON.parse(JSON.stringify(foo));
或者使用提供像jQuery这样的深层复制功能的库。