我正在将一些使用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。
答案 0 :(得分:1)
toBoolean,toNumber等上下文方法不适合检查类型。这些方法尝试进行“强制转换”,但不检查类型。 在您的示例中,toBoolean返回true,因为string不为空(请参阅context class 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));
}
}