私の第一印象は、これはおそらく良いことではないということです。for...in
の振る舞いは一種の奇妙で特異なものであり、それが正しいことだとは思わないので、これは私がこれまでに行うことではありません。しかし、これが本当にあなたが望むものであるならば、読み続けてください。
内部的には、実際のfor...in
ループはを使用しjs::ValueToIterator
、その関数はJSAPIを介して公開されていないように見えます(少なくともjsapi.cppはそれをどこにも呼び出しません)。したがって、2つのオプションがあります。
Mozilla JSチームにfor...in
、JSAPIを介して機械を公開するように説得します(作業を支援する意思がある場合、これは実行可能です)。また
実際には、for...in
ループを含むJSコードをコンパイルします。
オプション2の方が速くなります。この関数は、次のように使用できます。
function ForInResults(obj) {
return [v for (v in obj)];
}
または、イテレータを使用する場合:
function ForInIterator(obj) {
for (var v in obj)
yield v;
}
を使用してこれらの関数のいずれかをコンパイルしてJS_CompileFunction
から、を使用して呼び出すことができますJS_CallFunctionValue
。配列から個々の要素を取得するには、とを使用JS_GetArrayLength
しJS_GetElement
ます。イテレータから値を取得するのは少し難しいですが、for...in
ループ中にプロパティが追加または削除されるという珍しいケースでは、実際のループに似ています。