URLSearchParams这东西有点特殊。主要是以下两种用法:
var paramsString = "q=URLUtils.searchParams&topic=api"
var searchParams = new URLSearchParams(paramsString);
var keys = searchParams.keys();
var ret = keys[Symbol.iterator];
console.log("ret::" + ret);
也就是说需要给keys实现Symbol.iterator属性。
quickjs并没有导出Symbol.iterator相关的接口,需要我们自行添加一下。
主要的添加点是:JS_NewAtomWithSymbol、JS_SymbolGetIterator
也就是把quickjs自己用的JS_ATOM_Symbol_iterator(这是个常量)导出来。
注意这里不能是直接用JS_NewAtom(ctx, "Symbol.iterator");去生成atom,这会和JS_ATOM_Symbol_iterator不一样。
另外就是
var keys = searchParams.keys();
for(var key of keys) {
console.log("key::" + key);
}
这种遍历keys的调用方式,我发现只要给searchParams注册了next函数,quickjs就会自动调用过来:
(下面是调用堆栈)
blink::IteratorV8Internal::nextMethodCallback v8::internal::FunctionCallbackArguments::onCFunctionCallback js_call_c_function JS_CallInternal JS_Call JS_IteratorNext2 JS_IteratorNext js_for_of_next JS_CallInternal JS_CallFree JS_EvalFunctionInternal