これは機能します:
for (var i = 0; i < this.size(); i++) {
values.push(this.cards[i].value);
}
しかし、これはしません:
for (var card in this.cards) {
values.push(card.value);
}
なんで?
これは機能します:
for (var i = 0; i < this.size(); i++) {
values.push(this.cards[i].value);
}
しかし、これはしません:
for (var card in this.cards) {
values.push(card.value);
}
なんで?
ループでfor...in
は、変数は値ではなくキーです。
そのはず:
for (var card in this.cards) {
values.push(this.cards[card].value);
}
for (var card in this.cards) {
values.push(card.value);
}
...card
値ではなく、インデックス番号になります。
ループはfor..in
、プロパティ値ではなく、オブジェクトのプロパティ名を列挙します。次のようにする必要があります。
for ( var key in this.cards ) {
values.push( cards[key].value );
}
の欠点の 1 つfor..in
は、継承されたプロパティ名も列挙することです (もちろん、対応するプロパティが列挙可能な場合のみ)。
また、これを考慮してください:
var values = this.cards.map(function ( card ) {
return card.value;
});
構文がオブジェクト (キー) の PROPERTIES をループするため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)
それが何をするのかを理解しない限り、使用しないでください-刺すつもりはありません。私自身が一度経験した多くの髪を引っ張ったり頭を引っ掻いたりすることからあなたを救うだけです:/