IE8 Array和indexOf发生冲突

时间:2013-05-22 15:13:56

标签: javascript jquery

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

仅在IE8上发生了错误。

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

PS:我甚至不确定它是否是导致此问题的原因

感谢。

2 个答案:

答案 0 :(得分:3)

除了不使用for...in迭代数组外,如果必须使用for...in,请将其与hasOwnProperty结合使用,以判断您正在查看的属性是否属于有问题的对象,或来自原型:

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

答案 1 :(得分:1)

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

拥有一个数组的重点是它有一个编号的元素序列,所以你应该使用for()循环。

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

在这种情况下,这将解决问题,因为它只会迭代编号元素,因此indexOf方法不会参与。

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

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

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

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

这被认为是每个for(..in..)循环的最佳做法。事实上,如果您使用像JSLint这样的工具来检查您的编码风格,如果您不这样做,它会抱怨。