繁体   English   中英

IE8 Array与indexOf冲突

[英]IE8 Array and indexOf conflict

我目前正在使用jQuery 1.8.3。 我认为它为Array.prototype添加了indexOf ,所以现在我的每个数组始终包含indexOf方法作为第一个元素。 for (var i in object)我总是将infexOf方法作为我的第一个元素,它使我的代码出错。

Bug仅发生在IE8上。

我想要的是从所有数组中删除此indexOf或无论如何要破解jquery /解决此问题。

PS:我什至不确定是否是jquery导致了此问题

谢谢。

除了不使用for...in遍历数组外,如果必须使用for...in ,则将其与hasOwnProperty结合使用以判断您正在查看的属性是否确实属于所讨论的对象,或者来自原型:

for (var prop in myObject) {
    if (myObject.hasOwnProperty(prop)) {
        // this didn't come from the prototype.
    }
}

正确的答案是,您不应该使用for(...in...)循环来迭代Javascript中的数组。

拥有Array的全部要点是它具有编号的元素序列,因此您应该使用for()循环。

for(var i=0; i<myArray.length; i++) {
     //do stuff here with myArray[i]
}

在这种情况下,仅此一项就可以解决问题,因为它只会迭代编号的元素,因此不会涉及indexOf方法。

但是, for(..in..)这里for(..in..)的问题进行简短的解释可能会有所帮助,所以让我解释一下...

您看到的错误的根本原因是因为IE8中的数组不支持indexOf方法,因此代码中的某些内容(虽然不是jQuery)已将其添加到Array原型中。

反过来,这意味着当您执行for(..in..)循环时,它将被拾取为要迭代的元素之一。

在这种情况下,您有一个更好的解决方案( for()循环;请参见上文),但是在确实需要使用for(..in..)循环的情况下,这可能是一个真正的问题。 您可以通过在for(..in..)循环内立即检查hasOwnProperty()来防止此情况。 对于属于对象原型的项,此函数返回false ,因此它有助于您避免在循环对象时碰到不需要的方法。

对于每个for(..in..)循环,这均被视为最佳实践。 实际上,如果您使用JSLint之类的工具来检查您的编码样式,那么如果您不这样做,它将抱怨。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM