根据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(...)
被称为?
答案 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的最佳实践,以及JSLint和JSHint等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]);
}
您正在使用的表单用于迭代对象及其原型链的成员。
答案 2 :(得分:0)
或者,您可以在循环体的开头添加一行,如下所示:
for(var i in myArray) {
if(typeof(myArray[i])=="function") continue;
...
...
...
}
这个不会增加缩进,并且更容易复制粘贴到源中的每个循环中(如果您使用 for..in 很多并且不要&#39 ; t想弄得一团糟),只要你没有故意在你的阵列中存储功能,你就可以了。