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

时间:2012-06-22 10:50:28

标签: javascript arrays internet-explorer-6 indexof

根据the way to add indexOf method to Array class in IE6,我如何拒绝此方法迭代任何随机数组?例如:

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 属性并停止迭代,而不向其中添加任何代码

for(...)

被称为?

3 个答案:

答案 0 :(得分:7)

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

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

有两种方法:

首先,对于数组,请不要使用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/

答案 1 :(得分:2)

为数组使用正确的for(...)循环。

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

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

for
for...in

答案 2 :(得分:0)

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

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

这个不会增加缩进,并且更容易复制粘贴到源中的每个循环中(如果您使用 for..in 很多并且不要&#39 ; t想弄得一团糟),只要你没有故意在你的阵列中存储功能,你就可以了。