【问题标题】:Nashorn: Strict equality comparing BigDecimal with numberNashorn:将 BigDecimal 与数字进行比较的严格等式
【发布时间】:2017-04-13 15:52:41
【问题描述】:

在 Oracle 的 JDK 1.8.0_121 中,在 Nashorn(JDK 中嵌入的 JavaScript 引擎)内,new BigDecimal(1.0) === 1falsenew BigDecimal(1.0) == 1true

使用 JDK 1.8.0_121 的 jjs (Nashorn REPL):

jjs> var BigDecimal = Java.type("java.math.BigDecimal")
jjs> var bd = new BigDecimal(1.0)
jjs> bd
1
jjs> bd === 1.0
false
jjs> bd == 1.0
true

使用 JDK 1.8.0_74 的jjs

jjs> var BigDecimal = Java.type("java.math.BigDecimal")
jjs> var bd = new BigDecimal(1.0)
jjs> bd
1
jjs> bd === 1.0
true
jjs> bd == 1.0
true

这是在 Nashorn 中对平等的严格规则的已知收紧吗? Nashorn 中是否有明确的 === 严格相等运算符规范可以解释这种行为以及行为的变化?

或者这是JDK中的回归?

【问题讨论】:

  • 在我看来更像是一个错误修复。对象实例不应该是=== 到一个数字。
  • 是的,它可能是一个错误修复,但我在任何发行说明中都找不到对它的引用。我的假设是先前的行为是允许 java.lang.Number 的任何子类将 === 变为一个数字(包括 BigDecimal),但对于 Nashorn 来说什么是“正确的”却很少有细节。
  • 请注意,在纯 JavaScript 中,new Number(1) === 1false

标签: javascript java nashorn


【解决方案1】:

这是 JDK 1.8.0_101 及更高版本中的有意更改,记录在 JDK-8143896 中。严格相等的处理必须是有意的,因为它是用test case that covers BigDecimal being compared to an integer 调用的。

这在 JDK 发行说明中并未提及,但可以确认为有意更改行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多