javascript - Javascript 中的 Nan 与 JDK8 上的 javax.scriptEngine 的比较

标签 javascript java java-8 nan javax.script

根据 IEEE 754 NaN 与任何数字的相等比较都应为假(Java 和 JavaScript 语言)。但在下面的代码中,使用 javax scriptEngine for JavaScript,一个设置为 NaN 的变量与自身相比返回 true。

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Main {

    public static void main(String[] args) throws ScriptException {
        final ScriptEngineManager mgr = new ScriptEngineManager();
        final ScriptEngine engine = mgr.getEngineByName("JavaScript");
        System.out.println("neq: " + engine.eval("a1 = NaN; a1!=a1;"));
        System.out.println("eq: " + engine.eval("a1 = NaN; a1==a1;"));
        System.out.println("nid: " + engine.eval("a1 = NaN; a1!==a1;"));
        System.out.println("id: " + engine.eval("a1 = NaN; a1===a1;"));
    }
}

输出:

neq: true
eq: true
nid: true
id: false

使用甲骨文JDK:

java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

我的理解是“eq”表达式应该返回 false。

当 a1 为 NaN 时,为什么 a1 == a1 True 而不是 False?

最佳答案

导致此行为的原因似乎是赋值的副作用,或者更具体地说,是重新赋值(在同一脚本中)的副作用。我将您的测试用例修改为

final ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
System.out.println("neq: " + engine.eval("a1 = NaN; a1!=a1;"));
System.out.println("eq: " + engine.eval("a1 = NaN; a1==a1;"));
System.out.println();
engine = mgr.getEngineByName("JavaScript");
System.out.println("eq: " + engine.eval("a1 = NaN; a1==a1;"));
System.out.println("neq: " + engine.eval("a1 = NaN; a1!=a1;"));
System.out.println();
engine = mgr.getEngineByName("JavaScript");
engine.eval("a1 = NaN;");
System.out.println("neq: " + engine.eval("a1!=a1;"));
System.out.println("eq: " + engine.eval("a1==a1;"));
System.out.println();
engine = mgr.getEngineByName("JavaScript");
engine.eval("a1 = NaN;");
System.out.println("eq: " + engine.eval("a1==a1;"));
System.out.println("neq: " + engine.eval("a1!=a1;"));

得到:

neq: true
eq: true

eq: false
neq: false

neq: false
eq: true

eq: true
neq: false

因此,当 a1 没有在引擎中重新分配时,它会表现出一致(不一定正确)的行为,而重新分配后,结果不仅是错误的,而且是完全不一致的。

关于javascript - Javascript 中的 Nan 与 JDK8 上的 javax.scriptEngine 的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33414102/

相关文章:

javascript - 处理大数据时的json.parse函数

java - 从 LSB 插入中检索该位

java - Character.IsWhiteSpace 解释

javascript - 从 Web 到打印的 SVG

javascript - $.getJSON 后退按钮显示 JSON 返回数据而不是页面

javascript - 隐藏默认浏览器滚动条不溢出 :hidden when using Perfect Scrollbar

java - 如何从二维数组中获取元素而不循环整个数组?

java - 我的应用程序的 Recycler View 中的 Android Studio SearchView 过滤器问题

elasticsearch - 无法在带有 Java 8 的 Windows 10 上安装 elasticsearch 5.1.1

Java 方法引用解析