JDK 1.8.0_92 Nashorn JS 引擎indexOf 行为

2024-02-16

我在 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 代码,它返回与 build 91 中一样的“-1”。

有谁知道为什么两个jdk版本的结果有这么大的差异?这是一个错误还是故意更改的?


好吧,如果您知道更改的确切版本号,您就知道在哪里查找:1.8u92 错误修复列表 http://www.oracle.com/technetwork/java/javase/2col/8u92-bugfixes-2949473.html列出了一些有关 Nashorn 的修复,其中最有趣的是JDK-8144020 https://bugs.openjdk.java.net/browse/JDK-8144020:

删除 long 作为内部数字类型

ECMA 将 double 定义为 JavaScript 中唯一的数字类型。在 Nashorn 中,我们在内部将数字表示为 int、long 和 double。使用 long 是有问题的,因为它为 double 提供的 53 位增加了额外的精度。 ……

乍一看,这似乎只是一个内部变化,但如果你意识到你之前的结果源于之前的事实,那么情况就会改变,eval返回了一个Long对于此代码,格式为"-1".

现在考虑这个错误报告的第一句话:“ECMA 将 double 定义为 JavaScript 中唯一的数字类型”。这得出的结论是返回一个Long不是指定的结果类型,而是实现工件。

所以显然,当long已从内部使用中删除,可以返回Long已被淘汰,引擎现在无法恢复Integer相反,但是Double,作为变革的副产品。

这解释了为什么还有其他脚本"var str = 'abcd'; str.indexOf('x');"仍然会产生没有小数位的输出。后一个脚本评估为Integer现在仍然如此。由于输出类型的变化是删除内部的副产品long用法,而不是有意改变所有非Double数值结果,内部使用int没有受到影响。

当将结果与 Chrome 引擎进行比较时,您必须考虑到您只是比较格式化输出,数字到字符串的转换不是脚本的一部分。所以结果是未知的。浏览器可以自由地呈现与没有小数位的整数值匹配的所有数值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDK 1.8.0_92 Nashorn JS 引擎indexOf 行为 的相关文章

随机推荐

  • 处理 appwidget 的多个实例

    我有一个配置活动 一个大型小部件提供程序和一个小型小部件提供程序 在配置活动中 我在共享首选项中保存了一些值 我从大大小小的应用程序小部件提供商那里获得了这些共享的偏好 我无法为应用程序小部件提供唯一的 ID 并且每次从配置活动转到应用程序
  • D7 需要苹果风格的“等待”动画

    有谁知道与 Delphi 7 一起使用的 Apple 风格 等待 动画 VCL 组件吗 谢谢 不知道当前的 Apple 外观如何 但这里有一个免费的在线服务来创建 Ajax 加载 gif 文件 http www ajaxload info
  • Spark 构建路径与不兼容的 Scala 版本 (2.10.0) 交叉编译

    当我尝试在 scala IDE 中执行 Spark sql 代码时 出现以下错误 有人可以帮我解决这个问题吗 spark build path is cross compiled with an incompatible version o
  • 在 AngularJS 中只注册一次事件监听器

    我正在将一个事件从我的导航栏控制器广播到另一个控制器 但是如果我多次初始化控制器 当我在应用程序中前后移动时 则在我的控制器上执行的函数 on事件运行多次 因为它已注册多次 rootScope on submitBookingDialog
  • 如何指定DbContext要使用的表的名称

    这是来自的后续问题我之前的问题 https stackoverflow com questions 26404786 dbcontext doesnt give any data 我的印象是 如果数据库中有多个表 则该表的名称DbSet变量
  • 我在哪里可以找到将任意布尔表达式转换为合取或析取范式的方法?

    我写过一个小应用程序 https bitbucket org BillyONeal pevfind overview将表达式解析为抽象语法树 现在 我对表达式使用一系列启发式方法来决定如何最好地评估查询 不幸的是 有些例子使查询计划变得非常
  • Mongoose 不会从 JSON 数组创建子文档

    我正在尝试将包含第一级数据和数组的 JSON 对象写入 MongoDB 相反 发生的情况是所有第一级数据都被存储 但数组中包含的任何内容都没有存储 当记录服务器接收到的数据时 我看到了整个对象 这让我相信我的 Mongoose 代码有问题
  • 获取裸存储库的工作副本

    我有一台服务器 上面有一个用于推送的裸存储库 但是 我的服务器需要有主分支的工作副本 如何仅从裸存储库获取工作副本 您可以简单地将存储库克隆到同一台计算机上的另一个目录 git clone bare repo dir 当前目录将成为您的存储
  • 如何识别哪个容器拥有哪个覆盖目录?

    My var lib docker overlay目录包含我的容器的数据 但目录名称均经过哈希处理 如何确定哪个容器拥有哪个覆盖层 您可以使用jq像这样 docker inspect docker ps qa jq r map Name G
  • BinaryFormatter 中的引用完整性

    Protobuf net 中 AsReference 选项的存在以及 BinaryFormatter 是 图形序列化器 这个词让我假设 BinaryFormatter 不维护引用 并且它会复制每个对象 但我做了一些测试 发现单个 Binar
  • 从 VB.NET 中的 List(Of T) 中删除重复项

    我无法从列表中删除重复项 我究竟做错了什么 Dim Contacts As New List Of Person remove duplicates Contacts Contacts Distinct New PersonEquality
  • 可靠集合缓存作为 Service Fabric 中的缓存

    我的系统使用一堆微服务来处理一个项目 我计划创建一个有状态微服务来保存该项目的最新状态 在该服务中 我计划将所有项目状态存储在可靠的字典中 并且每当访问项目时都会更新该项目的 上次访问 字段 我的要求是 我只想将最近使用的项目存储在可靠的集
  • bc 及其 ibase/obase 选项:

    我偶然发现了一个奇怪的错误 我想 我尝试将 512 读取为基数 6 的数字 并将其输出为基数 16 echo ibase 6 obase 16 512 bc 161 正如你所看到的 输出是161 但它应该是bc 原文如此 我尝试使用基数 1
  • PeekMessage 收不到消息?

    我创建了一个自定义消息类型 用于调整我的大小Window 称为WM NEED RESIZE 我已在 h 文件中定义它 并在 cpp 文件中初始化 我也注册了我的WindowProc接受消息的功能 以下是这些项目的代码 const uint3
  • 部署在iis上的asp.net core应用遇到500内部服务器错误

    哎呀 500内部服务器错误 启动应用程序时发生错误 当我将数据库功能添加到我的 asp net core 应用程序并将其部署到 iis 时 出现此消息 当我在 Visual Studio 中开发它时 一切都很顺利 但是部署之后就出现了这个错
  • Django 迁移添加默认字段作为模型函数

    我向 Django 模型添加了一个新的 不可为空的字段 并尝试使用迁移来部署该更改 我如何将现有模型使用的默认值设置为这些模型的某个函数而不是常量 举个例子 假设我以前有一个created on字段 我刚刚添加了一个updated on我想
  • 如何创建纵轴(Y 轴)为字符串的图表?

    我想要制作的图表是使用 Chart js 制作的折线图 纵轴为字符串 横轴为数字 例如 横轴是时间 纵轴是帽子的颜色 见下图 var myChart new Chart ctx type line data labels 1 2 3 4 5
  • Gridview动态添加新行

    我有一个文件上传控件 并且有一个按钮 上传 因此当单击通风口触发时 我希望在 gridview 中创建一个新行并获取文件名并绑定到列并将其显示在页面上 请问有什么想法该怎么做吗 这是代码 protected void Button1 Cli
  • Android - 将对象传递给另一个活动

    我正在利用以下类 我将其作为对象 http pastebin com rKmtbDgF http pastebin com rKmtbDgF 我正在尝试使用以下方式传递它 Intent booklist new Intent getBase
  • JDK 1.8.0_92 Nashorn JS 引擎indexOf 行为

    我在 java8 中使用 nashorn javascript 引擎在运行时评估一些表达式 我有一个 util 类 方法如下 public static String evaluateJavaScriptExpression String