2

我知道 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

4 回答 4

1

它被添加到原型中,因此每次您将数组视为对象(for..in循环就是一个示例)时,它都会显示出来。它不会出现在其他浏览器中,因为indexOf默认情况下它们已经具有该方法,因此您无需修改​​原型。

您可以使用obj.hasOwnProperty(propertyName)来测试一个属性是直接在您的对象(在这种情况下,您的数组,它基本上是一个对象)上还是在原型链中的其他地方定义的。

于 2013-07-18T08:53:56.123 回答
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
}
于 2015-04-03T13:30:55.720 回答
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
于 2013-07-17T21:08:53.323 回答
-2

IE<9 没有.indexOf()Array 的功能,要定义确切的规范版本,请在尝试使用之前运行它:

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

参考

于 2013-07-18T06:25:14.383 回答