在书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] = [];
,从而导致创建一个新的空对象。
获取对同一对象的引用与新对象的引用的规则是什么?我怎样才能使每个循环得到一个不同的空数组?
编辑:阅读人们的回复,我只是读错了段落。谢谢你的所有答案!
答案 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,outputvar my_array = [],
n = 5;
for (i = 0; i < n; i += 1) {
my_array[i] = [];
}
console.log(my_array); // [[], [], [], [], []]