javascript - 使用 SpiderMonkey 公共(public) API 复制 for...in 循环

标签 javascript for-loop spidermonkey

我正在尝试使用公共(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 不会在任何地方调用它)。所以你有两个选择:

  1. 说服 Mozilla JS 团队通过 JSAPI 公开 for...in 机制(如果您愿意帮助完成这项工作,这是可行的);或

  2. 实际编译一些包含 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_GetArrayLengthJS_GetElement。从迭代器中获取值有点棘手,但在循环时添加或删除属性的特殊情况下,它更像是真正的 for...in 循环。

关于javascript - 使用 SpiderMonkey 公共(public) API 复制 for...in 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12600842/

相关文章:

javascript - 在Nodejs中将流解析为对象

javascript 如何在每个单元格中添加一行?

java - 混淆Java链表问题的值

ecmascript-6 - ES6 映射和集合 : how are object keys indexed efficiently?

MongoDB SpiderMonkey 不理解 UTF-8

javascript - 遍历 HTML5 音频文件

javascript - 如何循环遍历多个对象的json

javascript - 如何在material-ui中将日期对象转换为字符串? ReactJS。在表格上显示日期

java - 嵌套 for-while 循环超出时间限制

JavaScript 性能 : Modulus operation of negative Number within decrementing loop slowing the code by more than 100%