铬将'remove'元素添加到数组中?



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

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

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

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


我们在这里的猜测是,您正在使用的某个第三方库正在向数组对象添加.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)也可用于解决此问题,但是如果您只想枚举数组项,则实际上应该使用枚举数组的正确方法。

最新更新