1

SpiderMonkey を使用するいくつかのコードを RHINO に変換しています。メソッド JSVAL_IS_INT(val) を使用します。ここで、'val' は jsval(SpiderMonkey コード) であり、'val' は RHINO の toNumber(val) を使用しようとしました。オブジェクトのインスタンスですが、toNumber は 'val' の型をチェックしていないようです。

これは、toBoolean を使用した同様のケースのコードです。

    ContextTest ct = new ContextTest();
    ct.val = "lol";
    System.out.println(Context.toBoolean(ct.val));
    System.out.println(ct.val);

これは次のことを示しています。

true
lol

しかし、toBoolean() は true を返すべきではありません。

4

1 に答える 1

2

toBoolean、toNumber などのコンテキスト メソッドは、型のチェックには適していません。これらのメソッドは「強制変換」を試み、型をチェックしません。あなたの例では、文字列が空ではないため、toBoolean は true を返します (コンテキスト クラス sourceを参照)。

値を整数にチェック/変換するには:

  if(val instanceof Integer) {
           Integer valInt = (Integer) val;
           System.out.println(valInt);
        } else if(val instanceof Scriptable) { //Rhino class embedes any js value
           Scriptable s = (Scriptable) val;
           String className = s.getClassName();// ECMA class name
           System.out.println(className);
           if(className.toLowerCase().equals("number")) {
              System.out.println(Context.toNumber(val)); 
           }
        }
于 2013-01-26T12:16:04.110 に答える