数组原型转发器功能错误的行为

时间:2015-04-14 08:58:15

标签: javascript

我有这么简单的乐趣:

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");

5 个答案:

答案 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