我一直在试验Rhino - > Java的互操作性,并且遇到了一些我无法解释的问题。
我正在从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类型。
知道为什么会这样吗?我似乎无法追查根本原因。
答案 0 :(得分: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到数字”)
请注意这些规范与版本5(ECMA标准)有关,这可能不是Rhino实现的版本,因此您可能希望在网站上查找与您的ECMA实现版本相匹配的规范,但这个问题是相同的因为语言是发明的。
因此,在了解上述内容时,可以在与任何JavaScript / ECMA引擎进行互操作时将整数值提升为“double”类型。