1

関数に渡される引数をJavascriptで列挙するために、関数で使用可能な'arguments'変数を使用しようとしています。

for (var i in arguments){
   ...
}

これは、ChromeコンソールとFirebugコンソールでは機能しているようですが、Rhinoでは機能しません。前者の2つでは、forループに入って引数を確認できますが、後者の場合、forループに入っているようには見えません。

なぜこれが起こっているのですか、どうすればこれを防ぐことができますか?

4

1 に答える 1

1

Javascriptからfor..inループオーバー引数ie.for(arg in arguments)はIE8では機能しませんが、Chrome8では機能します

まず、関数内で使用可能な引数オブジェクトは配列ではありませんが、インクリメンタルforループ(for(var i = 0、len = arguments.length; i <len; i ++ ){...})が望ましいです。これは、実行速度が速いだけでなく、他の落とし穴を回避できるためです。その1つは、まさにあなたが陥っている落とし穴です。

2番目のループが機能しない理由の質問に実際に答えるには、for...inループが機能することを理解することが重要です。オブジェクトで見つかったすべての列挙可能なプロパティを繰り返し処理します。さて、私はそのステートメントで2つの単語を太字にしました。これは、これらの2つの単語を意図的に使用して、微妙に見えるかもしれませんが、何が起こっているのかわからない場合にコードの動作に劇的な影響を与える可能性があるいくつかのニュアンスを示すためです。 。

まず、すべてに焦点を当てましょう。つまり、オブジェクト自体のプロパティだけでなく、オブジェクトがそのプロトタイプやプロトタイプのプロトタイプなどから継承した可能性のあるプロパティも含まれます。このため、ループが(obj.hasOwnProperty(p))の条件ですぐに追加修飾することにより、ループ内のfor ...を「保護」することをお勧めします(ループが(objのvar p ))。

しかし、それはあなたがここで遭遇していることではありません。そのために、列挙可能なその2番目の単語に焦点を当てましょう。JavaScriptのオブジェクトのすべてのプロパティは、列挙可能または列挙不可能のいずれかです。これは、プロパティがfor...inループに表示されるかどうかにほぼ直接関係します。FirefoxやIEなどのブラウザでは、引数オブジェクトの数値プロパティを列挙できません(また、その長さも列挙できません)。そのため、何も繰り返さないのです。

于 2011-08-11T06:40:55.620 に答える