为什么这个 JavaScript 代码使整个数组指向同一个对象
Why does this JavaScript code make the entire array point to the same object?
在书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,outputvar my_array = [],
n = 5;
for (i = 0; i < n; i += 1) {
my_array[i] = [];
}
console.log(my_array); // [[], [], [], [], []]
相关文章:
- JS数组-检查对象值是否重复
- 将单独的数组深层键转换为所需的类型(数组或对象)
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- 如何在javascript上向数组的对象添加新元素
- Javascript:创建一个随机数学方程数组作为对象,20次
- 为什么JavaScript的getElementsByClassName提供了一个不是数组的对象
- 为什么我可以在一个不是数组的对象上调用 Array.prototype.filter()
- 为什么数组和对象([ ] + {})的求和是javascript中的一个字符串
- 如何在Angular中检查数组中对象列表的至少一个值是否为true
- 将数组复制到“;这个“;变量(创建一个类似数组的对象)
- 如何按顺序(而不是索引)迭代一个类似数组的对象
- 使用下划线更改数组中对象的一个属性
- 如何根据一个属性和另一个给出所需顺序的数组对对象数组进行排序
- 数组的对象有另一个键,值在另一个对象
- angular 2-如何迭代JSON响应,该响应包含一个包含对象数组的对象
- javascript数组和对象是否有一个固定的顺序
- 使用另一个对象数组筛选对象数组
- JS Lodash:多维数组到对象,有一个扭曲
- 使用另一个属性值更改数组中对象的属性值
- 通过另一个整数数组筛选对象数组