2016-06-26 19 views
0

以下は、nameプロパティを出力することを目的としたコードアカデミーのコーディング演習です。エラーを説明してください、どうすれば修正できますか?コメントのように配列内のJavascriptオブジェクト

// Our Person constructor 
function Person(name, age) { 
this.name = name; 
this.age = age; 
} 

var family = new Array(); 
family[0] = new Person("alice", 40); 
family[1] = new Person("bob", 42); 
family[2] = new Person("michelle", 8); 
family[3] = new Person("timmy", 6); 

for (var i = 0; i <= family.length; i++) { 
console.log (family[i].name); 
}; 
// Now we can make an array of people 

// loop through our new array 

OUTPUT : 
alice 
bob 
michelle 
timmy 

--- 
We're running a test below to make sure your code works. 
alicebobmichelletimmy 
TypeError: Cannot read property 'name' of undefined 

------------------------------------------ 
Many thanks. 
+1

チェックは、配列の境界。 –

+0

@mparnisari:はい、OPは境界を使い果たしています。 'i SuperSaiyan

+3

私は知っている、私は彼/彼女がそれに気付くことを望んだ:) –

答えて

1

ループ内では、配列の境界を使い果たしています。以下を考慮する。

私は3つのアイテムの配列を持ち、インデックスは0,1,2です。ループ条件に<=演算子を使用すると、結果は0,1,2,3となります。それは未定義で、プロパティ名を見つけることができません。

配列は0から始まります。つまり、インデックスはゼロから始まります。 3つの要素を持つ配列がある場合、長さは3ですが、最大のインデックスは2(0,1,2)です。インデックスが長さと等しい場合でもforループがループし続けると、配列の要素が存在しないため、undefinedが返されます。

あなたの場合、配列に4つの要素、すべてのPersonオブジェクトがあります。それらはインデックス0,1,2,3によってアクセスされます。ループが3の後に続き、iが長さ(4)と等しいかどうかをチェックすると、配列の4番目の要素をチェックしようとします。配列の長さは要素数が5でなく4であるため、存在しません。

このようなループのために書き直し

for (var i = 0; i < family.length; i++) { 
    console.log (family[i].name); 
}; 

これは、未知のインデックスに反復からループを防ぐことができます。すべての要素がループスルーしたときにループを停止します。

1

が、(あなたは間違いから学ぶように、そのエラーの原因となる理由を理解)エラーを説明するために:私のコードは次のようになります - :

あなたが持っているループを実行していますあなたは

family[0] = new Person("alice", 40); 
family[1] = new Person("bob", 42); 
family[2] = new Person("michelle", 8); 
family[3] = new Person("timmy", 6); 

を持っているならば、あなたは長さ4の家族の配列を持っているが、そのインデックス付き0 -3になることを意味 - 配列がインデックス化さゼロなので

for (var i = 0; i <= family.length; i++) { 

これが問題を引き起こしています。

これは、i < = family.lengthの場合、存在しないインデックスを持つ要素を見つけようとしているため、エラーがスローされます。

前述のように、forループ内の=を削除するだけで、私は決して4にはならず、配列内の最も高いインデックスである3で停止するため、すべてがうまくいくでしょう。

for (var i = 0; i < family.length; i++) { 
0

言うあなたのライン: for (var i = 0; i <= family.length; i++) {

が言うべき: for (var i = 0; i < family.length; i++) {

をここで修正されたコードです:あなたが外で実行していない

// Our Person constructor 
 
function Person(name, age) { 
 
this.name = name; 
 
this.age = age; 
 
} 
 

 
var family = new Array(); 
 
family[0] = new Person("alice", 40); 
 
family[1] = new Person("bob", 42); 
 
family[2] = new Person("michelle", 8); 
 
family[3] = new Person("timmy", 6); 
 

 
for (var i = 0; i < family.length; i++) { 
 
console.log (family[i].name); 
 
};

+1

ありがとうございました。それを完全に逃した、少なくとも期待された場所でエラーを起こした:) –

+0

これは、StackOverflowがここにある理由です。ハッピーコーディング! –

関連する問題