如果将其添加到Array原型,则不迭代Array对象的函数

ris*_*hat 2 javascript arrays indexof internet-explorer-6

根据在IE6中将indexOf方法添加到Array类的方法,我现在如何通过迭代任意随机数组来拒绝此方法?例如:

Array.prototype.indexOf = function(needle) { ... };

var array = [1, 2, 3];
for (var i in array) {
    document.write(i + ': ' + array[i]);
}
Run Code Online (Sandbox Code Playgroud)

给出输出

0: 1
1: 2
2: 3
indexOf: function ...
Run Code Online (Sandbox Code Playgroud)

如何跳过indexOf属性并停止迭代它而不向其中添加任何代码

for(...)
Run Code Online (Sandbox Code Playgroud)

叫做?

Spu*_*ley 6

这是Javascript for..in循环的一个众所周知的问题.

你可能认为你只是循环遍历你直接添加的数组或对象的元素,但它也会循环遍历原型中的任何方法.这会产生意想不到的后果.

它有两种方法:

首先,对于数组,不要使用for..in.使用简单的for()循环 - 即:

for(var counter=0; counter<myArray.length; counter++) {...}
Run Code Online (Sandbox Code Playgroud)

建议将此表单用于数组,因为它保证只遍历数值数组元素.

当然,它不适用于通用对象,因为它们没有length属性或数字元素.对于这些,您仍然需要使用for..in,但是您还应该始终if()for..in循环中包含一个语句来过滤掉不需要的元素.

其格式应如下所示:

for (name in obj) {
    if (obj.hasOwnProperty(name)) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这看起来丑陋,而是因为不这样做的问题,建议最佳实践为Javascript,给JS代码质量cheking工具如点的JSLintJSHint将标志它作为一个问题,如果你不写for..in像你这样的循环.

您可以在此处阅读有关此问题的更多信息:http://yuiblog.com/blog/2006/09/26/for-in-intrigue/