我正在尝试使用公共(public) C JSAPI 来探测 SpiderMonkey(最新发布版本)中的一些 JavaScript。
如何使用公共(public) JSAPI 调用(例如 JS_GetPropertyById、JS_LookupProperty、JS_Enumerate 等)复制 for...in
循环的行为? documentation for JS_Enumerate表示它只返回目标对象的可枚举属性;它不会在对象的原型(prototype)链中搜索属性。我想复制 for...in 循环的确切行为,但避免将代码注入(inject)到 JS 环境中。看起来 JS_NewPropertyIterator 可能已被弃用,或者是一个很可能被弃用的候选者。
最佳答案
我的第一印象是这可能不是一件好事。这不是我会做的事情,因为 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
和 JS_GetElement
。从迭代器中获取值有点棘手,但在循环时添加或删除属性的特殊情况下,它更像是真正的 for...in
循环。
关于javascript - 使用 SpiderMonkey 公共(public) API 复制 for...in 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12600842/