Хорошо, я немного озадачен. Я, вероятно, пропускаю что-то очевидно очевидное, но по-видимому я просто не вижу лес для деревьев:
Я пытаюсь вызвать функцию JavaScript, которая ожидает, что ее параметр будет массивом, т.е. это проверяет if (arg instanceof Array)...
К сожалению, я (или Носорог) просто, может казаться, не создаю такой массив:
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();
И увы, result
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
Таким образом, это работает. За исключением того, что я хочу 'реальный' массив :)
Чуть не забыл:
Object.prototype.toString.call (a)
возвращает[массив объектов]
Хорошо, это важная информация. Это говорит нам о том, что массив действительно является массивом, просто он инициализируется конструктором Array
в другой области, чем та, которую проверяет функция, точно так же, как если бы вы тестировали массив из одно окно против конструктора Array
другого окна в приложении на основе браузера. Например, есть проблема с осциллографом.
Попробуйте заменить
Object[] fArgs = new Object[]{ new NativeArray(0) };
на
Object[] fArgs = new Object[]{ cx.newArray(scope, 0) };
..., чтобы убедиться, что используется правильный конструктор Array
. Поскольку вы перешли непосредственно к конструктору NativeArray
, вы обошли проверку правильности его области, поэтому конструктор объекта массива
имеет вид и Array
, но не конструктор тот же массив
, что и конструктор глобального объекта, который видит функция.