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

Why does this JavaScript code make the entire array point to the same object?

本文关键字:数组 一个对象 JavaScript 代码 为什么      更新时间:2023-09-26

在书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] = [];每个循环重新计算该行,从而导致创建一个新的空对象。

获取对同一对象的引用与新对象的引用的规则是什么?我如何让它在每个循环中获得不同的空数组?

编辑:阅读人们的回应,我只是读错了这一段。感谢您的所有答案!

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

问题更有可能出在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] = [];
}

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

第 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]

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

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

其实不然。每个循环用一个新的、不同的空数组填充主数组的第 i元素。请参阅此 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); // [[], [], [], [], []]