【发布时间】:2017-04-13 15:52:41
【问题描述】:
在 Oracle 的 JDK 1.8.0_121 中,在 Nashorn(JDK 中嵌入的 JavaScript 引擎)内,new BigDecimal(1.0) === 1 是 false,new BigDecimal(1.0) == 1 是 true:
使用 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) === 1是false。
标签: javascript java nashorn