2

这似乎是从最新的 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()函数,所以我的代码在它的轨道上停止并出现错误。我不想通过我的所有代码手动从数组中删除元素,那么是否有某种我可以设置的标志或我可以在执行之前运行的命令以防止添加额外的元素?

4

1 回答 1

2

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

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

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


我们在这里的猜测是,您正在使用的某个第 3 方库正在向.remove()数组对象添加一个方法,因此当您迭代任何数组实例的可枚举属性时,您也会获得该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("=");
    ...
}

仅供参考,lines.hasOwnProperty(i)也可以用来解决这个问题,但如果你只是想枚举数组项,你真的应该使用正确的枚举数组的方法。

于 2013-10-25T20:07:21.140 回答