我有这么简单的乐趣:
Array.prototype.arrayRepeat = function(value, times) {
for (var x=0;x<times;x++) this[x]=value;
}
然后我有:
var errs=[];
errs.arrayRepeat([],10);
当我向项目3添加新值时(例如)
errs[3].push ("hello")
我看到了10岁以下的人怎么回事?物品有一个&#34;你好&#34;值。
我不明白为什么。任何帮助将不胜感激。
编辑:
我想要一个数组数组。我加上你好&#39;至errs[3]
,因为我希望:errs[3]= ["hello"]
。后来也许我想:errs[3]=["hello","good-bye"]
,所以我写errs[3].push("goodbye");
答案 0 :(得分:2)
您需要将arrayRepeat函数修改为如下所示:
Array.prototype.arrayRepeat = function(value, times) {
for (var x=0; x < times; x++) this[x] = value.slice();
}
答案 1 :(得分:1)
因为errs中的数组共享相同的引用。 当你做的时候
errs.arrayRepeat([],10);
阵列被复制&#34;通过引用,所以当一个被修改时,所有其他的都是。
答案 2 :(得分:1)
让我们重写一下。
a = [];
errs.arrayRepeat(a, 10);
现在errs
在每个位置都有一个引用到a
。
然后,您执行与errs[3].push('hello')
a.push('hello')
因为errs
中的每个元素 a
都会得到此结果。
答案 3 :(得分:1)
您正在为errs中的每个项添加相同的引用,因此当您向该数组添加项时,对该数组的每个引用都会看到该项。
执行值的深层复制的简便方法:
Array.prototype.arrayRepeat = function(value, times) {
for (var x=0;x<times;x++) this[x]=JSON.parse(JSON.stringify(value))
}
答案 4 :(得分:0)
您的方法适用于数字,字符串或布尔值数组
但它只为所有索引创建一个数组。
在重复之前检查对象。
Array.repeater= function(val, len){
var A= [],
check=typeof val== 'object' && val.constructor;
while(len--){
if(check){
val= new val.constructor(val);
}
A.push(val);
}
return A;
}
//test object
var B= Array.repeater(new Date(2015, 3, 14), 10);
B[3].setDate(16);
B.join('\n')
/* returned value: (String)
Tue Apr 14 2015 00: 00: 00 GMT-0400(Eastern Standard Time)
Tue Apr 14 2015 00: 00: 00 GMT-0400(Eastern Standard Time)
Tue Apr 14 2015 00: 00: 00 GMT-0400(Eastern Standard Time)
Thu Apr 16 2015 00: 00: 00 GMT-0400(Eastern Standard Time)
Tue Apr 14 2015 00: 00: 00 GMT-0400(Eastern Standard Time)
Tue Apr 14 2015 00: 00: 00 GMT-0400(Eastern Standard Time)
Tue Apr 14 2015 00: 00: 00 GMT-0400(Eastern Standard Time)
Tue Apr 14 2015 00: 00: 00 GMT-0400(Eastern Standard Time)
Tue Apr 14 2015 00: 00: 00 GMT-0400(Eastern Standard Time)
Tue Apr 14 2015 00: 00: 00 GMT-0400(Eastern Standard Time)
*/
without the object check, every item would mirror the changed date