Как создать 'реальный' массив JavaScript у Носорога

Хорошо, я немного озадачен. Я, вероятно, пропускаю что-то очевидно очевидное, но по-видимому я просто не вижу лес для деревьев:

Я пытаюсь вызвать функцию 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

Таким образом, это работает. За исключением того, что я хочу 'реальный' массив :)

7
задан n3rd 22 June 2010 в 07:33
поделиться

1 ответ

Чуть не забыл: 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 , но не конструктор тот же массив , что и конструктор глобального объекта, который видит функция.

8
ответ дан 7 December 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: