JDK 1.8.0_92 Nashorn JS引擎indexOf行为
JDK 1.8.0_92 Nashorn JS engine indexOf behaviour
我在java8中使用"nashorn" javascript引擎在运行时评估一些表达式。我有一个util类,方法是:
public static String evaluateJavaScriptExpression(String expression) throws ScriptException {
if (expression == null) {
return null;
}
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine javaScriptEngine = scriptEngineManager.getEngineByName(JAVASCRIPT_ENGINE);
return String.valueOf(javaScriptEngine.eval(expression));
}
,我为此创建了一些单元测试。其中一条是这样的:
String expression = "var arr = [1, 3, 2, 5, 4]; arr.indexOf(0);";
assertEquals("-1", ExpressionEvaluatorUtil.evaluateJavaScriptExpression(expression));
当我使用java版本"1.8.0_91"时,它工作得很好。但是使用java版本"1.8.0_92"的人报告说测试失败了。我把我的版本切换到build 92,它对我来说也失败了。实际结果是"-1.0"。此外,我在Chrome控制台尝试了相同的js代码,它返回"-1",如在构建91。
有谁知道为什么两个jdk版本之间的结果会有这样的差异?这是一个bug还是故意更改的?
如果您知道更改的确切版本号,您就知道该去哪里查看:1.8u92错误修复列表列出了有关Nashorn的一些修复,最有趣的是JDK-8144020:
删除long作为内部数字类型
ECMA将double定义为JavaScript中唯一的数字类型。在Nashorn中,我们内部将数字表示为int、long和double。使用long是有问题的,因为它在double提供的53位基础上增加了额外的精度。…
乍一看,这似乎只是一个内部的变化,但如果你意识到你以前的结果源于这样一个事实,即以前,eval
返回了一个Long
为这个代码,被格式化为"-1"
。
现在考虑这个bug报告的第一句话:"ECMA将double定义为JavaScript中唯一的数字类型"。由此得出的结论是,返回Long
不是指定的结果类型,而是实现工件。
显然,当long
从内部使用中删除时,返回Long
的可能性被消除了,引擎现在不返回Integer
,而是返回Double
,作为变化的副产品。
这解释了为什么像"var str = 'abcd'; str.indexOf('x');"
这样的脚本仍然产生没有小数的输出。后一个脚本的计算结果为Integer
,现在仍然如此。由于输出类型的更改是删除内部long
使用的副产品,而不是有意更改所有非Double
数字结果,因此内部使用int
的位置不受影响。
当与Chrome的引擎比较结果时,你必须考虑到你只是比较格式化的输出,数字到字符串的转换不是脚本的一部分。所以结果是不确定的。浏览器可以自由地显示所有与整数值匹配的数值,而不包含小数。
如果我们看一下ScriptEngine的java文档。eval(String input)方法,它返回一个对象,然后由开发人员根据javascript的返回类型将对象类型转换为正确的类型。所以,我认为问题在于String.valueOf()方法调用,表达式的求值返回一个浮点数。
我认为你将不得不改变你的代码做Integer.valueOf(javascriptenengine .eval(expression));
希望这对你有帮助
- 从js引擎的角度来看闭包和构造函数是如何工作的
- 使用Node.js在应用程序引擎上进行本地单元测试
- 自定义警报/弹出窗口和保持JS引擎
- 敲除js外部模板引擎-没有加载模板
- 具体来说,JS引擎对小写和大写区域设置敏感
- PHP还是JS模板引擎?(对于同一html的多个块)
- 科尔多瓦使用什么js“引擎”
- 使用 V8 JavaScript 引擎在没有 Web 视图的情况下执行 JS 库
- JS引擎何时创建垃圾回收根
- Nodejs4.x上的ES6代码:V8 4.5是一个直接运行ES6的原生JS引擎吗
- 在JavaScript中访问JS引擎日期常量的方法
- js引擎何时插入分号
- 如何访问IE XHTML DOM+JS引擎,而无需启动浏览器本身
- 浏览器javascript兼容系统级js引擎
- 用于2D开发的3D JS引擎
- setTimeout'函数调用最终会杀死JS引擎
- 是否可以在google V8 JS引擎中添加javascript扩展?
- 有安卓内置浏览器开发者指南吗?在哪里查找JS引擎的差异
- 有人能使用Mozilla吗;的Rhino JS引擎
- JDK 1.8.0_92 Nashorn JS引擎indexOf行为