Chrome将“删除”元素添加到数组?

时间:2013-10-25 19:54:54

标签: javascript arrays google-chrome

这似乎是从最新的Chrome更新开始的,我正试图找到有关它的信息,但一直没有成功。请考虑以下代码:

var lines = ['asdf','qwer',''];
for (var i in lines) console.log(i, lines[i]);

如果我在Firefox“Firebug”控制台中运行它,我的输出正如预期的那样:

0 asdf
1 qwer
2 (an empty string)

但是,当我在Chrome控制台中运行它时,我明白了:

0 asdf
1 qwer
2 
remove function ( from, to )
{
    var rest = this.slice((to || from) + 1 || this.length);
    this.length = from < 0 ? this.length + from : from;

    return this.push.apply(this, rest);
}

我注意到经常会有额外的“删除”项目。问题是它打破了我下载使用的几个jQuery插件,它们的代码如下:

for (var i in lines) {
    line = lines[i].split("=");
    ...

由于额外元素是一个函数,而不是一个字符串,因此它没有split()函数,所以我的代码在错误中停止了。我不想手动删除数组中的所有代码,所以是否可以设置某种标志或命令我可以在执行之前运行以防止添加额外的元素?

1 个答案:

答案 0 :(得分:2)

这看起来是为什么你永远不应该使用构造for (var i in lines)来枚举数组中的条目的经典原因。

for (var i in lines)构造枚举数组对象的属性,包括数值数组索引之外的内容,例如可枚举的已添加属性和方法。

如果您使用for (var i = 0, len = lines.length; i < len; i++),则只会枚举数组中的实际项目。


我们的猜测是你正在使用的第三方库是在数组对象中添加.remove()方法,因此当你迭代任何数组实例的可枚举属性时,你也得到了{{1} } property。

如果切换到数组枚举的remove方法,则不会出现此问题。

for (var i = 0, len = lines.length; i < len; i++)

仅供参考,for (var i = 0, len = lines.length; i < len; i++) { line = lines[i].split("="); ... } 也可用于解决此问题,但如果您只想枚举数组项,则应该使用正确的枚举数组方式。