2

我正在尝试使用 for 循环将数组的成员添加回自身。

为什么此代码会导致脚本无响应?

var magicarray = {

    arraymemeber: [1, 2, 3, 4, 5],

    duplicate: function () {
        for (var i = 0; i < this.arraymemeber.length; i++) {
            this.arraymemeber.push(this.arraymemeber[i]);
        };
    }
};

console.log(magicarray.duplicate());
4

5 回答 5

5

尽管我不确定您为什么要这样做,但为了避免您当前首先获得长度并仅在数组的原始长度上迭代的无限循环。

var magicarray = {

    arraymemeber: [1,2,3,4,5],

    duplicate: function() {

        var length = this.arraymemeber.length;

        for (var i = 0; i < length; i++) {
            this.arraymemeber.push(this.arraymemeber[i]);
        };
    }
};

console.log(magicarray.duplicate());
于 2013-05-09T19:13:42.337 回答
4

因为您在迭代时将新项目推入,并且您的条件基于 current .length,从而导致无限迭代(或至少与.length允许的迭代一样高)


如果您想将数组“加倍”,则不需要循环。你可以这样做:

this.arraymember.push.apply(this.arraymember, this.arraymember)

所以你的对象是:

var magicarray = {

    arraymemeber: [1, 2, 3, 4, 5],

    duplicate: function () {
        this.arraymember.push.apply(this.arraymember, this.arraymember)
    }
};
于 2013-05-09T19:11:49.660 回答
1

每次您绕过循环时,您都会将一个项目放入数组中。这会将其长度增加 1。

由于this.arraymemeber.length以与 相同的速率增加,因此i您永远不会到达循环的结尾。

于 2013-05-09T19:11:51.550 回答
1

因为在每次迭代中,您都在向正在迭代的元素添加一个新元素。

检查在i < this.arraymemeber.length每次迭代结束时进行。数组的长度不会以任何方式缓存。

要防止无限循环,请使用

for (var i = 0, len = this.arraymemeber.length; i<len; i++) {

... 反而。

于 2013-05-09T19:12:29.420 回答
-6

只需这样做:

this.arraymemeber = this.arraymemeber.concat(this.arraymemeber);
于 2013-05-09T19:12:15.707 回答