2013-10-25 95 views
2

这似乎是从最新的Chrome更新开始的,我试图找到关于它的信息但未成功。请看下面的代码:Chrome向数组添加'remove'元素?

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

如果我运行在Firefox的“萤火虫”控制台,我的输出,符合市场预期,这就是:

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

请*不要*用阵列中的'for ... in' –

+0

chrome究竟是什么版本?看起来这更像是一个插件向数组原型添加'remove'的插件。 – numbers1311407

+4

'(var in array)'包含继承的属性。你应该使用数字迭代或者检查'lines.hasOwnProperty(i)'。见http://stackoverflow.com/questions/3010840/loop-through-array-in-javascript/3010848#3010848 – Barmar

回答

2

这看起来像一个经典的原因,你为什么不应该使用构造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)也可以用来工作,解决此问题,但如果你只是wnat枚举数组项,你应该只使用枚举阵列的正确方法。

+0

这是一切都很好,但在这一点上,我有一个非常大的网站,直到最近工作,现在没有。我不想通过40,000行代码寻找'for ... in'的实例并替换它们。再次,这只发生在Chrome,而不是Firefox。有没有办法阻止这种情况发生? – DiMono

+0

@DiMono - 你的代码是错误的,你已经将它与第三方库结合在一起,这会让你错误的代码中断。您可以通过删除添加'.remove'属性或修复代码的第三方库来修复它。严重的是,使用带有大量第三方代码的'for(i in line)'是一个滴答作响的定时炸弹,它只是在你身上爆炸。你真的应该修正你的代码。如果您现在不修复您的代码并找到一些解决方法,那么您的错误代码将来可能会再次爆炸。好的软件工程师会花时间修复错误的代码。 – jfriend00

+0

这不是我写的代码,它主要是第三方的jQuery插件。但是,我已经证实,在裸露的Chrome窗口中不会发生。所以这确实是与另一个插件添加.remove属性。谢谢你的回答,表明这可能是问题,现在是时候去打猎了。 – DiMono