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

Javascript Array.prototype.indexOf被添加到IE8中数组的末尾,javascript,arrays,internet-explorer-8,internet-explorer-7,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; } }

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

毫不奇怪,这破坏了网站上的一切。IE10或IE9中没有出现问题。非常感谢您的帮助。

听起来您在迭代数组时可能做错了什么。我在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/>");

听起来您在遍历数组时可能做错了什么。我在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/>");

IEIE它被添加到原型中,因此每次您将数组视为..in循环的对象时,它都会显示出来。它不会出现在其他浏览器中,因为默认情况下它们已经有indexOf方法,所以您不会修改原型


您可以使用来测试属性是否直接定义在您的对象上。在本例中,您的数组基本上是一个对象,或者是原型链中的其他位置。

它被添加到原型中,因此每次您将数组视为..in loop的对象时,它都会显示出来。它不会出现在其他浏览器中,因为默认情况下它们已经有indexOf方法,所以您不会修改原型


您可以使用来测试属性是否直接定义在您的对象上(在本例中,您的数组基本上是一个对象)或原型链中的其他位置。

在使用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
}

在使用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
}

它既没有被添加到开头也没有添加到结尾。这只是另一种继承财产。这将成为一个问题的唯一方法是,如果您使用for in来迭代数组,正如您所看到的,这通常是一个坏主意。我们使用普通的old for循环来迭代数组。那么我不明白问题是什么。我的意思是,很明显,您确实希望将该方法作为一个属性从数组中访问,否则它将不会非常有用。因此,您唯一应该偶然发现它的时间应该是在for-in循环中。您能描述一下造成问题的情况吗?当然,您不是在暗示obj.obj2['indexOf']是问题所在,是吗?使用if object.hasOwnPropertyproperty在循环中过滤所有for..in,还是不要扩展Array.prototype并将其用作独立函数。在较新的浏览器上,您可以使用Object.defineProperty在原型上定义方法,以确保它不可枚举。然后,我认为您需要进一步解释您的问题。在jsfiddle上为我们创建一个场景查看并在您的问题中发布场景代码。从另一个角度看,这并没有错,因为在Array.prototype上定义了indexOf,如果执行[][indexOf],它肯定会显示出来,就像执行[][slice]一样,它既没有添加到开始,也没有添加到结束。这只是另一种继承财产。这将成为一个问题的唯一方法是,如果您使用for in来迭代数组,正如您所看到的,这通常是一个坏主意。我们使用普通的old for循环来迭代数组。那么我不明白问题是什么。我的意思是,很明显,您确实希望将该方法作为一个属性从数组中访问,否则它将不会非常有用。因此,您唯一应该偶然发现它的时间应该是在for-in循环中。您能描述一下造成问题的情况吗?当然,您不是在暗示obj.obj2['indexOf']是问题所在,是吗?使用if object.hasOwnPropertyproperty在循环中过滤所有for..in,还是不要扩展Array.prototype并将其用作独立函数。在较新的浏览器上,您可以使用Object.defineProperty在原型上定义方法,以确保它不可枚举。然后,我认为您需要进一步解释您的问题。在jsfiddle上为我们创建一个场景查看并在您的问题中发布场景代码。从另一个角度看,这并没有错,因为正如您在Array.prototype上定义了indexOf一样,如果您使用[][indexOf],它肯定会显示出来,就像使用idnexOf函数本身执行[][slice]一样。我只是想知道为什么IE8显示有一个带有“indexOf”键的数组项,这就是原型设计的工作原理。您正在将一个新对象(在本例中是一个函数)添加到所有Array类型的对象中。下面是原型工作原理的一个很好的解释:使用idnexOf函数本身就可以了。我只是想知道为什么IE8显示有一个带有“indexOf”键的数组项,这就是原型设计的工作原理。您正在将一个新对象(在本例中是一个函数)添加到所有Array类型的对象中。这里有一个关于原型如何工作的很好的解释:这不是问题的答案,或者说是吗?但它并没有回答问题-1将在您更新答案后将其删除
@EpokK似乎是更好的代码,没有问题。但是我们这里有一个问题,我怀疑使用这个代码并不能解决OP的问题。如果我错了,请解释我。这不是问题的真正答案,或者是吗?但它没有回答问题-1将在您更新后将其删除answer@EpokK似乎更好的代码,没问题。但是我们这里有一个问题,我怀疑使用这个代码并不能解决OP的问题。如果我错了,请解释一下。
for (var i = 0, len = myArray.length; i < len; i++) {
    if (typeof myArray[i] === "function") {break;}

    // some code for myArray trully elements
}