好的,我有点困惑。我可能漏掉了一些非常明显的东西,但显然我只能看到树木而看不到森林:
我试图调用一个期望其参数为数组的JavaScript函数,即它会检查 if (arg instanceof Array)...
不幸的是,我(或Rhino)似乎无法创建这样的数组:
Context cx = Context.enter();
Scriptable scope = cx.initStandardObjects();
String src = "function f(a) { return a instanceof Array; };";
cx.evaluateString(scope, src, "<src>", 0, null);
Function f = (Function) scope.get("f", scope);
Object[] fArgs = new Object[]{ new NativeArray(0) };
Object result = f.call(cx, scope, scope, fArgs);
System.out.println(Context.toString(result));
Context.exit();
哎呀,结果是 false
。
我错过了什么吗?
编辑:
再多提供一点信息: [] instanceof Array
和 new Array() instanceof Array
都像人们期望的那样返回 true
。如果我向数组中添加元素,它们会在 JavaScript 代码中以正确的索引(数字,从零开始)显示:
NativeArray a = new NativeArray(new Object[]{ 42, "foo" });
使用此JavaScript函数输出时:
function f(a) {
var result = [];
result.push(typeof a);
for (var i in a) {
result.push(i + ' => ' + a[i]);
}
return result.join('\\n');
}
结果是:
object
0 => 42
1 => foo
它能工作。除了我想要一个“真正”的数组 :)
a instanceof Array
)是合理的,但有限。例如,即使没有Rhino,在基于浏览器的应用程序中,如果数组源自另一个窗口,它也无法识别数组。您会尝试将result.push(Object.prototype.toString.call(a));
添加到函数中吗?看看它是否会显示“[object Object]”或“[object Array]”,这将类似于来自另一个窗口的数组,前者表明“NativeArray”并不像其名称所示。 - T.J. CrowderNativeArray
的 JavaDoc 吗?因为这里似乎没有:http://www.mozilla.org/rhino/apidocs/ - T.J. Crowdernew NativeArray()
与调用Context.newArray()
相同。http://mxr.mozilla.org/mozilla/source/js/rhino/src/org/mozilla/javascript/NativeArray.java - n3rdObject.prototype.toString.call(a)
返回[object Array]
。 - n3rd