0

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

基本上我在 chrome 的开发者工具控制台中做了这个测试。

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

0
1
2
compare 

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

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

4

4 回答 4

2

for ... in ...迭代对象的可枚举属性,不适用于数组索引。数组索引也是可枚举的属性,但正如您发现的那样,任何不安全添加的内容Array.prototype也会被返回。

Array.prototype在 ES5 浏览器中安全地添加(不可枚举的)方法,您可以使用Object.defineProperty,例如:

Object.defineProperty(Array.prototype, 'compare', {
    value: function() {
        ...
    }
});

这将停止for ... in破坏,但当感兴趣的变量是数组时,它仍然是工作的错误工具。

于 2013-10-05T23:13:38.063 回答
1

最好使用索引 for 循环。For..in 还枚举继承的属性等。

var request = [0,1,2];
for (var i = 0; i < request.length; i++) {
   console.log(request[i]);
}

这个问题的最佳答案:

stackoverflow 上一个答案

说得比我好:

于 2013-10-05T23:16:52.143 回答
0

在您的情况下,全局“对象原型”作为为其声明的比较函数,例如..

object.prototype.compare = function (a,b) {return a === b}

...因此,每当您迭代一个对象(数组是一种对象)时,您也会迭代它原型的“比较”函数......它是它的“成员”。

于 2013-10-05T23:24:43.177 回答
0

正如其他人指出for .. in的那样,这不是遍历数组的最佳方式。如果您出于某种原因坚持使用它 - 使用hasOwnProperty方法来确定该属性确实属于数组:

var arr = [0,1,2];

for (var request in arr ) { 
    if (arr.hasOwnProperty(request)) console.log(request);
}
于 2013-10-05T23:35:47.787 回答