为什么这个JavaScript代码使整个数组指向同一个对象?

时间:2016-02-29 03:21:02

标签: javascript

在书Javascript: The Good Parts中,第64页上有这段代码:

for (i = 0; i < n; i += 1) {
 my_array[i] = [];
}
// Note: Array.dim(n, []) will not work here.
// Each element would get a reference to the same
// array, which would be very bad.

为什么数组中的每个元素都指向同一个对象?在我看来,每一个循环都会重新评估一行my_array[i] = [];,从而导致创建一个新的空对象。

获取对同一对象的引用与新对象的引用的规则是什么?我怎样才能使每个循环得到一个不同的空数组?

编辑:阅读人们的回复,我只是读错了段落。谢谢你的所有答案!

3 个答案:

答案 0 :(得分:1)

此循环每次都会获得新的引用。运行它,改变其中一个数组,你会看到只有一个更改。

问题更可能出现在Array.dim方法中。我想它实现了这样的事情:

Array.dim = function(n, init) {
  var arr = [];
  var i;

  for (i = 0; i < n; i += 1) {
    arr[i] = init;
  }

  return arr;
}

使用文字数组语法创建对数组的新引用,但此方法使用相同引用来填充结果数组的每个值。

以这种方式比较两者可能是最容易的。

var init = [];
for (i = 0; i < n; i += 1) {
  arr[i] = init;
}

第一种方法创建一个数组,然后使用它来填充每个元素。

for (i = 0; i < n; i += 1) {
  arr[i] = [];
}

第二种方法为循环的每次迭代创建一个新的引用。

答案 1 :(得分:1)

行“每个元素都将获得与第63页的Array.dim实现相关的相同内容的引用:

// "Javascript: The Good Parts", page 63.
Array.dim = function (dimension, initial) {
 var a = [], i;
 for (i = 0; i < dimension; i += 1) {
 a[i] = initial;
 }
 return a;
};

第64页的代码为您提供了一组不同的数组指针。

for (i = 0; i < n; i += 1) {
 my_array[i] = [];
}


// you can try to do this:
my_array[0].push(1);
my_array[1].push(2);

console.log(my_array[0]);
// [1]

console.log(my_array[1]);
// [2]

答案 2 :(得分:1)

你的问题的前提是不正确的:

  

为什么数组中的每个元素都指向同一个对象?

没有。每个循环使用一个新的不同的空数组填充主数组的 i th 元素。 See this jsBin

http://jsbin.com/zudiwamice/edit?js,console,output
var my_array = [],
    n = 5;
for (i = 0; i < n; i += 1) {
  my_array[i] = [];
}
console.log(my_array); // [[], [], [], [], []]