我的第一印象是,这可能不是一件好事。这不是我永远不会做的事情,因为它的行为for...in
有点奇怪和特殊,我只是不认为这是正确的事情。但如果这真的是你想要的,请继续阅读。
在内部,一个实际的for...in
循环使用js::ValueToIterator
,并且该函数似乎没有通过 JSAPI 公开(至少 jsapi.cpp 不会在任何地方调用它)。所以你有两个选择:
说服 Mozilla JS 团队通过 JSAPI 公开for...in
机器(如果您愿意帮助这项工作,这是可行的);或者
实际编译一些有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
and JS_GetElement
。从迭代器中获取值有点棘手,但在循环时添加或删除属性的不寻常情况下,它更像是一个真正for...in
的循环。