1

我正在将一些使用 SpiderMonkey 的代码翻译成 RHINO,它使用 JSVAL_IS_INT(val) 方法,其中 'val' 是 jsval(SpiderMonkey 代码),我尝试使用 RHINO 的 toNumber(val),其中 'val' 是Object 的一个实例,但 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,因为 string 不为空(请参阅上下文类源)。

要将值检查/转换为整数,请使用:

  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 回答