我不知道如何准确地表达这个问题,但我发现这非常有线。
基本上我在 chrome 的开发者工具控制台中做了这个测试。
for (var request in [0,1,2]) { console.log(request);}
0
1
2
compare
最后四行都是 for 循环的输出。在 for 循环期间,请求得到了值比较。
我想知道这是否是chrome中的错误。
我不知道如何准确地表达这个问题,但我发现这非常有线。
基本上我在 chrome 的开发者工具控制台中做了这个测试。
for (var request in [0,1,2]) { console.log(request);}
0
1
2
compare
最后四行都是 for 循环的输出。在 for 循环期间,请求得到了值比较。
我想知道这是否是chrome中的错误。
for ... in ...
迭代对象的可枚举属性,不适用于数组索引。数组索引也是可枚举的属性,但正如您发现的那样,任何不安全添加的内容Array.prototype
也会被返回。
要Array.prototype
在 ES5 浏览器中安全地添加(不可枚举的)方法,您可以使用Object.defineProperty
,例如:
Object.defineProperty(Array.prototype, 'compare', {
value: function() {
...
}
});
这将停止for ... in
破坏,但当感兴趣的变量是数组时,它仍然是工作的错误工具。
最好使用索引 for 循环。For..in 还枚举继承的属性等。
var request = [0,1,2];
for (var i = 0; i < request.length; i++) {
console.log(request[i]);
}
这个问题的最佳答案:
说得比我好:
在您的情况下,全局“对象原型”作为为其声明的比较函数,例如..
object.prototype.compare = function (a,b) {return a === b}
...因此,每当您迭代一个对象(数组是一种对象)时,您也会迭代它原型的“比较”函数......它是它的“成员”。
正如其他人指出for .. in
的那样,这不是遍历数组的最佳方式。如果您出于某种原因坚持使用它 - 使用hasOwnProperty方法来确定该属性确实属于数组:
var arr = [0,1,2];
for (var request in arr ) {
if (arr.hasOwnProperty(request)) console.log(request);
}