我目前使用 jquery 1.8.3。我认为它添加indexOf
到Array.prototype
所以现在我的每个数组总是包含方法 indexOf 作为第一个元素。这样做for (var i in object)
我总是将方法 infexOf 作为我的第一个元素,它破坏了我的代码。
错误仅发生在 IE8 上。
我想要的是从所有数组中删除这个 indexOf 或者无论如何破解 jquery /解决这个问题。
PS:我什至不确定它是否是 jquery 是这个问题的原因
谢谢。
我目前使用 jquery 1.8.3。我认为它添加indexOf
到Array.prototype
所以现在我的每个数组总是包含方法 indexOf 作为第一个元素。这样做for (var i in object)
我总是将方法 infexOf 作为我的第一个元素,它破坏了我的代码。
错误仅发生在 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..)
这里对问题的简要解释可能会有所帮助,所以让我解释一下......
您看到的错误的根本原因是因为indexOf
IE8 中的数组不支持该方法,因此您的代码中的某些内容(虽然不是 jQuery)已将其添加到 Array 原型中。
这反过来意味着当您执行for(..in..)
循环时,它将被拾取为要迭代的元素之一。
在这种情况下,您有一个更好的解决方案(for()
循环;见上文),但在您确实需要使用for(..in..)
循环的情况下,这可能是一个真正的问题。hasOwnProperty()
您可以通过立即在for(..in..)
循环内部进行检查来防止这种情况。此函数返回false
对象原型中的项目,因此它可以帮助您避免在循环对象时遇到不需要的方法。
for(..in..)
这被认为是每个循环的最佳实践。事实上,如果您使用JSLint 之类的工具来检查您的编码风格,如果您不这样做,它会抱怨。