for ... in循环中的奇怪问题

时间:2012-07-30 18:13:13

标签: javascript arrays for-loop for-in-loop

这有效:

for (var i = 0; i < this.size(); i++) {
    values.push(this.cards[i].value);
}

但这不是:

for (var card in this.cards) {
    values.push(card.value);
}

为什么?

4 个答案:

答案 0 :(得分:6)

因为在for...in循环中,变量是键,而不是值。

应该是:

for (var card in this.cards) {
    values.push(this.cards[card].value);
}

答案 1 :(得分:3)

for (var card in this.cards) {
    values.push(card.value);
}

... card将是索引号,而不是值。

答案 2 :(得分:2)

for..in循环枚举对象的属性名称,而不是属性值。应该是:

for ( var key in this.cards ) {
    values.push( cards[key].value );
}

for..in的一个缺点是它还枚举了继承的属性名称(当然,只有相应的属性是可枚举的)。


另外,请考虑一下:

var values = this.cards.map(function ( card ) {
    return card.value;
});

答案 3 :(得分:1)

因为for (var x in y)语法循环于对象(键)的属性,如果它是一个数组,它可以是数组的成员,也可以是其他可枚举属性。

例如:

var person={fname:"John",lname:"Doe",age:25}; 

for (x in person)
{
  txt=txt + person[x];
}

将打印出所有属性(JohnDoe25),但是数组的成员是元素(例如数组中包含的值)以及原型属性。考虑一下:

// Somewhere deep in your javascript library...
Array.prototype.foo = 1;

// Now you have no idea what the below code will do.
var x, a = [1,2,3,4,5];
for (x in a){
    // Now foo is a part of EVERY array and 
    // will show up here as a value of 'x'
}

x会在循环中的某个点出现foo的值,但这几乎不会是预期的。

我会说不要使用for(var x in y),除非你明白它的作用 - 不要试图成为一个刺,只是为了让你免受大量的拉毛和头疼,我自己经历过在某一点上:/