for(数组中的键)循环数组原型

时间:2013-10-05 23:07:21

标签: javascript arrays google-chrome

我不知道如何准确地说出这个问题,但我发现这非常有线。

基本上我在chrome的开发人员工具控制台中进行了这项测试。

for (var request in [0,1,2]) { console.log(request);}

0
1
2
compare 

最后四行是for循环的所有输出。 在for循环期间,请求得到了值比较。

我想知道这是否是Chrome中的错误。

4 个答案:

答案 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]);
}

这个问题的最佳答案:

stackoverflow previous answer

比我更好:

答案 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);
}