javascript数组对象分配给正常

时间:2015-07-23 02:47:36

标签: javascript

我尝试了以下代码

var foo = [1,2];
var bar = foo;
bar[0] = 9;
console.log(foo[0],bar[0]);    //the result is 9,9

如何foo [0]可以是9?请告诉我这个被卡住了。谢谢。

3 个答案:

答案 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)

  1. 使foo成为一个数组。
  2. 使bar成为对foo
  3. 的引用
  4. 更改bar将真正改变foo
  5. 现在foobar ...反之亦然

答案 2 :(得分:1)

数组和对象和函数是javascript中的引用,而数字和字符串是值。因此,当你这样做:

var foo = [];
var bar = foo;

变量bar现在指向foofoobar都指向相同的数组。

如果要复制数组,请使用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这样的深层复制功能的库。