2011-09-27 42 views
1

我一直在试验Rhino - > Java的互操作性,并且遇到了一些我不能解释的东西。Rhino JS NativeArray类型

我正在从Java调用脚本,将结果强制转换为Java对象,然后检索结果。

在我的JS:

this.objectmap.put("list", [1,1,2,3,5]); 

在NativeArray构造函数中设置断点,我看到的是被在外观传递的对象数组如下:

[1.0,1.0,2,3,5] 

其中1.0是Double类型和2,3,5是Integer类型。

任何想法为什么发生这种情况?我似乎无法找到根本原因。

回答

1

JavaScript(或更确切地说ECMA脚本)没有一个整数的概念。它只是有一个“数字”的概念,这可能碰巧包含一个整数值或一个实数值(浮点数)。两者都作为一个实际值存储在变量中,因此存储在内存中。

因此,为了将其转换为Java代码,它使用“double”类型来表示它,因为这是最接近的表示形式。

http://www.ecma-international.org/publications/standards/Ecma-262.htm

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf(规格和部分8.5号码类型,9.3 toNumber)

注意这些规范涉及到第5版(ECMA标准的),这可能不是什么犀牛工具,所以你可能希望在网站上查找符合ECMA实施版本的规范,但自从语言发明以来,这件事情一直如此。

因此,了解上述情况时,可以在与任何JavaScript/ECMA引擎进行互操作时将整数值提升为“double”类型。

+0

感谢您的信息。你是绝对正确的 - *在Java中处理它们时,我的JS数值中的大部分都是double类型的。只有在我使用数组的类型开始混合的情况下。 – eff