7

わかりました、私は少し困惑しています。私はおそらく露骨に明らかな何かを見逃していますが、どうやら私は木のために森を見ることができないようです:

パラメータが配列であることを期待する 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 Arraynew 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

それでうまくいきます。「本当の」配列が欲しいことを除いて:)

4

2 に答える 2

8

ほとんど忘れていた:Object.prototype.toString.call(a)返品[object Array]

さて、それは重要な情報です。これは、配列が実際には配列であることを示しています。これArrayは、関数がテストしているスコープとは異なるスコープのコンストラクターArrayによって初期化されているということです.ブラウザベースのアプリ。たとえば、スコープの問題があります。

交換してみる

Object[] fArgs = new Object[]{ new NativeArray(0) };

Object[] fArgs = new Object[]{ cx.newArray(scope, 0) };

...正しいArrayコンストラクターが使用されていることを確認します。コンストラクターに直接行ったためNativeArray、そのスコープが正しいことを確認することをバイパスしたため、配列オブジェクトconstructorはコンストラクターですが、関数が参照するグローバル オブジェクトのコンストラクターと同じコンストラクターではあり Arrayません。 Array

于 2010-06-22T09:24:27.137 に答える