2011-01-25 13 views
2
Array.prototype.last = function() { if(this.length !=0) return this[this.length-1]; } 
myarray = new Array(1,2,3); 
    for(var i in myarray){ 
    alert(i+'='+myarray[i]); 
} 

上記のコードを実行すると、それが正しく、各ループに警告し、その後終了時に別のアラートがArray.prototype.last法源とポップアップ。JSプロトタイプ戻りプロトタイプコード

これは私がプロトタイプメソッドを定義するたびに発生し、私はその理由を知りません!

は、だから私はのためのアラートを取得:0 = 1,1 = 2,2 = 3、その後に1つ:

last=function() { 
    if (this.length != 0) { 
    return this[this.length - 1]; 
    } 
} 

答えて

6

for-in声明オブジェクトのプロパティを列挙ためですが、継承されたものを含みます。

for-inステートメントを配列またはという配列のようなオブジェクトをオブジェクトとして使用する理由の1つは、悪い習慣とみなされます。

var a = []; 
a[1] = 'b'; 
a[0] = 'a' 

for (var prop in a) { console.log(i); } 

ほとんどのブラウザはあなたが検出します:

他の理由は、列挙の順序は仕様によって保証されていないことなどが、これは、インデックスプロパティは、例えば、数字の順で訪問されない可能性があることを意味しに配列を反復しようとすると、プロパティは数値順に表示されますが、IEでは、作成された順に列挙されます。1、次に0です。

for-inステートメントは、わかっているように、継承されたメンバーを列挙するために、オブジェクトのプロトタイプチェーン全体をイントロスペクションする必要があるため、単純なシーケンシャルループよりも遅くなることがあります。

一般的な推奨事項として、への連続ループを使用して、オブジェクトを繰り返し処理します。あなたはobject内のJavaScriptのための...ループ繰り返し処理ですべて以上のプロパティをfor(idx in anArray){...}を使用することはありません、なぜ

+0

ああ、よく私はあなたが知っているとき、それは明らかだが、私は(VAR I = 0の場合よりも書き込みに速くする(配列のVAR)を見つけると思います。私 crankshaft

+0

@Crankshaft:この問題を回避するには、jQuery $ .each()、つまり$ .each(myarray、function(index、value){alert(value);})を使用できます。 – dhinesh

0

これは、とArray

も参照してください。 JSのobjectであり、Arrayのすべてのインスタンスに新しいプロパティを追加したので、forループのインデックスの1つとして表示されます。一般的に、あなたがすべきアレイと

:最後はmyarrayのプロトタイプのプロパティから派生し、インデックス可能な関数であるため、

for(var i=0 ; i< anArray.length ; i++){ 
    //do stuff 
} 
+0

より正確には、配列のすべてのインスタンスによって列挙可能で継承されるArrayのプロトタイプにプロパティを追加しました。それと "すべてのインスタンスにプロパティを追加する"の間の明確化のビット。 –

+0

@Ken、ありますか?このように、プロトタイプに追加することで、このプロパティは 'Array'の現在および将来のすべてのインスタンスから利用できないのでしょうか? JSのプロトタイプのセマンティクスは、私はそのステートメントが間違っていると誤解を招くことはありません。 – tobyodavies

+0

「Arrayのすべてのインスタンスに新しいプロパティを読み込む」とき、私は潜在的なあいまいさを見ました。実際には価値のある独自のコピーを持つすべてのインスタンス間で、共通の1つの場所から継承します。誰もがプロトタイプの仕組みを理解しているわけではないので、私は解釈の余地を残すのが好きではありません;)あなたが話していたことを明らかに知っていましたが、誰もが最初の言葉からそれを集めたわけではありません。 'sallimsayin。 –

0

です。あなたがチェックする必要があることを回避するために、hasOwnPropertyをすなわち:

for(var i in myarray) 
{ 
    if(myarray.hasOwnProperty(i)) 
    alert(i+'='+myarray[i]); 
} 
+0

+1プロトタイプの継承と列挙可能性の適切な説明とhasOwnPropertyが、それでも配列の反復のためには...のためにはっきりしない方がいいです。 –

+0

@Ken:ありがとう。合意した@誰か:私はdownvoteの理由を知りたいです。 – Chandu

+1

おそらく、彼らは配列のためにfor ... forを続けて使うと、私はあまりにも寛大であると思っていました。 = / –

関連する問題