我将项目推入数组,但脚本变得无响应

I am pushing items into an array but the script becomes unresponsive?

本文关键字:脚本 响应 项目 数组      更新时间:2023-09-26

我正在尝试使用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());

虽然我不确定为什么要这样做,但为了避免无限循环,您目前已经首先获得长度,并且只迭代数组的原始长度。

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

因为您在迭代时推入新项,并且您的条件基于当前的.length,导致无限迭代(或至少与.length允许的高度相同)


如果你想"double"数组,你不需要循环。你可以这样做:

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

每次循环一次,都将一个项放入数组中。它的长度增加了1。

由于this.arraymemeber.lengthi以相同的速率增长,因此您永远不会到达循环的末端。

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

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

要防止无限循环,请使用

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

…div。

就这样做:

this.arraymemeber = this.arraymemeber.concat(this.arraymemeber);