Rhino - Scriptable方法:对象get(String name,Scriptable start)没有找到正确的键(数字字符串)

时间:2014-04-25 05:42:34

标签: java javascript rhino

我正在使用Rhino将javascript对象解析为我的Java应用程序,并希望了解Scriptable对象的get方法的行为。

我的javascript对象与此类似:

Obj = {};
Obj['001'] = 'First Content';
Obj['100A'] = 'Second Content';
Obj['100'] = 'Third Content';

正如in the documentation所述,我应该使用带整数和Scriptable开头的签名。

  

JavaScript代码| Java代码

     

a [3] | a.get(3,a)

     

a [“3”] | a.get(3,a)

我的问题是:为什么带有String参数的签名不能与数字字符串匹配?

我的解决方案是正确的还是只能使用(String name,Scriptable start)签名?

// Scriptable scope already defined
// id is an object from scope.getIds()
Scriptable content;

if(id instanceof Integer) {
    content = scope.get((Integer) id, scope);
} else {
    content = scope.get((String) id, scope);
}

谢谢

Rhino 1.7R2

1 个答案:

答案 0 :(得分:1)

我意识到这并没有明确地解决你的问题(这是你想要理解的),但我想建议你决定不理解。

只需像这样实施Scriptable.get(int,Scriptable)

Object get(int index, Scriptable start) {
  return this.get(String.valueOf(index),start);
}

......不要再担心了。这个奇怪的双API用于属性访问可能存在一些古老的性能原因。请记住,Rhino的根很老,回到Netscape(!)试图用Java重写Netscape Navigator(!)的时候。 JavaScript标准中的数字属性和其他属性没有区别,因此在我看来,您最好不要在对象中匹配语言的行为,而不要担心Rhino的特性。