Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Java脚本与JDK8上的javax.scriptEngine的Nan比较_Javascript_Java_Java 8_Nan_Javax.script - Fatal编程技术网

Javascript Java脚本与JDK8上的javax.scriptEngine的Nan比较

Javascript Java脚本与JDK8上的javax.scriptEngine的Nan比较,javascript,java,java-8,nan,javax.script,Javascript,Java,Java 8,Nan,Javax.script,根据IEEE 754,与任何数字的相等比较都应为假(Java和JavaScript语言)。但在下面的代码中,使用javax scriptEngine for JavaScript,将变量设置为NaN并与自身进行比较,返回true import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class Main {

根据IEEE 754,与任何数字的相等比较都应为假(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
使用oracle 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
没有在引擎中重新分配时,它表现出一致(不一定正确)的行为,而在重新分配时,结果不仅是错误的,而且是完全不一致的。

如果我添加这段代码

    engine.eval("a1 = NaN;");
    System.out.println("eq: " + engine.eval("a1==a1;"));
    System.out.println("neq: " + engine.eval("a1!=a1;"));
    System.out.println();
    engine.eval("a1 = NaN;a2 = NaN");
    System.out.println("eq: " + engine.eval("a1==a2;"));
    System.out.println("neq: " + engine.eval("a1!=a2;"));
    System.out.println();
这表明,即使没有重新分配,结果也是不一致的。我得到:

情商:没错 neq:错

情商:错
neq:在Java中为true,但是
!(Double.NaN==Double.NaN)
。我猜JavaScript将数字映射到
.equals
。这看起来像是脚本引擎中的一个bug。很好,这听起来像是Nashorn的bug。我在JDK bug跟踪器中找不到任何与此相关的东西。我做了更多的实验,结果变得更加混乱。它什么时候会表现出什么样的行为是完全不可预测的。唯一不变的是,当它切换到可复制的行为时,它是错误的。我有一种强烈的感觉,我们这里有不止一个bug。可能只是对eval()的第一次调用产生了正确的输出,而从第二次调用开始产生了错误的输出。这可以解释为什么在单独调用中赋值似乎会产生一致的结果。