我知道IE8和更早版本没有indexOf函数。我将其定义如下:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(obj, start) {
for (var i = (start || 0), j = this.length; i < j; i++) {
if (this[i] === obj) { return i; }
}
return -1;
}
}
我可以正确地获取数组中的值索引,但是当使用IE8和更早版本时,该函数被添加到我的数组的末尾。因此,我得到的结论是:
obj.obj2[0] = 'data'
obj.obj2[1] = 'other data'
obj.obj2['indexOf'] = [definition of indexOf function]
毫不奇怪,这打破了网站上的其他所有内容。 IE10或9中没有出现问题。感谢所有帮助。
答案 0 :(得分:1)
它被添加到原型中,所以每当你像对象一样对待你的数组时(for..in
循环就是一个例子),它就会显示出来。它没有显示在其他浏览器中,因为默认情况下它们已经有indexOf
方法,因此您不会修改原型。
您可以使用obj.hasOwnProperty(propertyName)
来测试属性是否直接定义在您的对象上(在本例中,您的数组,基本上是一个对象)或原型链中的其他位置。
答案 1 :(得分:0)
在迭代数组时听起来可能会出错。我在IE8中运行了以下内容,并没有得到你提到的行为:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(obj, start) {
for (var i = (start || 0), j = this.length; i < j; i++) {
if (this[i] === obj) { return i + " used prototype"; }
}
return -1;
}
}
var myCars=new Array("Saab","Volvo","BMW");
document.write(myCars.indexOf("Volvo") + "<br/><br/>");
for (i = 0; i < myCars.length; i++)
document.write(i + ": " + myCars[i] + "<br/>");
输出:
1 used prototype
0: Saab
1: Volvo
2: BMW
答案 2 :(得分:0)
在我们使用Array.prototype.someFunction的情况下, 要在IE 8中过滤真正的数组元素,我们可以使用:
for (var i = 0, len = myArray.length; i < len; i++) {
if (typeof myArray[i] === "function") {break;}
// some code for myArray trully elements
}
答案 3 :(得分:-2)
IE&lt; 9没有Array的.indexOf()
函数,用于定义确切的规范版本,在尝试使用它之前运行它:
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(elt /*, from*/)
{
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++)
{
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}