2

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

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

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

给出输出

0: 1
1: 2
2: 3
indexOf: function ...

如何跳过indexOf属性并停止对其进行迭代而不向 where 添加任何代码

for(...)

叫做?

4

3 回答 3

6

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

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

有两种解决方法:

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

for(var counter=0; counter<myArray.length; counter++) {...}

建议将这种形式用于数组,因为它保证只遍历数字数组元素。

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

其格式应如下所示:

for (name in obj) {
    if (obj.hasOwnProperty(name)) {
        ...
    }
}

这看起来很难看,但是由于不这样做的问题,建议使用 Javascript 的最佳实践,以至于如果您不编写, JSLintJSHint等 JS 代码质量检查工具会将其标记为问题你的for..in循环是这样的。

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

于 2012-06-23T21:53:10.500 回答
2

通过for(...)对数组使用正确的循环。

for (var i = 0, length = array.length; i < length; i++) {
    console.log(i + ": " + array[i]);
}

您使用的表单用于迭代对象及其原型链的成员。


...在

于 2012-06-22T10:55:41.347 回答
0

或者,您可以在循环体的开头添加一行,如下所示:

for(var i in myArray) {
    if(typeof(myArray[i])=="function") continue;
    ...
    ...
    ...
}

这个不会增加缩进,并且更容易复制粘贴到源代码中的每个循环中(如果你经常使用for..in并且不想弄得一团糟),只要你不这样做t故意将函数存储在数组中,你很高兴。

于 2015-08-15T19:46:09.870 回答