Array.prototype.indexOf被添加到IE8中的数组末尾

时间:2013-07-17 20:47:17

标签: javascript arrays internet-explorer-8 internet-explorer-7

我知道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中没有出现问题。感谢所有帮助。

4 个答案:

答案 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;
  };
}

Reference