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