2011-08-16 6 views
4

私は3つのオブジェクトを持つ配列でこれを呼び出しています。これらの余分なキーに加えて正しいキーを返すことになります... が余分な鍵を返していますか?

なぜですか?

+0

はなぜだけではなく、forまたはwhileループの通常のでしょうか? – sdleihssirhc

+0

それらはオブジェクトのプロトタイプに追加されるのでしょうか? JavaScriptでは、以下を使用する必要があります:foo {if(foo.hasOwnProperty(i)){...}}のiのために、node.js/coffeescriptがこれをサポートする方法がわからない場合 –

答えて

6

あなたまたはあなたが使用しているライブラリがArrayプロトタイプを拡張しているため、追加のプロパティが表示されています。彼の答えでマイクが指摘しているように、あなたはhasOwnPropertyを使ってそれらをスキップすることができます。

for own i of foo 
    obj = foo[i] 
    ... 

しかし、マイクはまた、彼の答えで指摘するように、それはカウンタをインクリメントするのではなく繰り返し処理を行うことにより、配列をループに、より効率的です:確かに、CoffeeScriptのは、その中に組み込まれてownキーワードがあなたのためにこれを行い持ちますキー。これを行うには、あなたがCoffeeScriptののfor...in構文を使用したい:

for obj in foo 
    ... 

(あなたが同様のループのインデックスが必要な場合は、for obj, i in fooを書くことができます。)

+0

ああ、偉大なことを知って、それを今すべて理解してください。前にCoffeeScriptsを完全に理解していなかった。 「自分のために」知っていることも素晴らしいです。 – fancy

+0

+1、 'own'について知りませんでした! –

3

for (... in ...)オブジェクトのプロトタイプのものが返されます。これは、文字列の代わりに数字キーを取得し、確実に順序で繰り返し処理の利点を持っているJavaScript for...in vs for

最善の解決策は、インデックスループを使って配列の要素を反復することである

for (var i = 0, n = arr.length; i < n; ++i) { ... } 

参照してください。

また、hasOwnPropertyを使用して、プロトタイプからキーを取得しないようにすることもできます。

for (var k in obj) { 
    if (!obj.hasOwnProperty(k)) { continue; } 
    ... 
} 

か、hasOwnPropertyがオーバーライドされる心配している場合にはバリエーション。

Object.definePropertyを使用して、これらのプロトタイププロパティをenumerable: falseと定義することもできます。

+0

なぜdownvoteですか? –

+0

@Mikeおそらくあなたの答えはJavaScriptに関するもので、質問はCoffeeScriptに関するものだったでしょう。 (あなたの答えは確かに便利です。) –

+0

@トレヴァー、応答に感謝します。 CoffeeScriptは確かに別の言語ですが、他の言語にコンパイルを開始するほとんどの言語のように、早期採用者は基礎となる言語の詳細を理解しなければなりません。Cの初期採用者は、それはコンパイルされ、Scalaの早期採用者はJavaやJVMについて知らなくても得ることができませんでした。 –

関連する問題