在Nashorn中区分null和undefined的值

7
我正在运行这段代码。
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("var out;");
engine.eval("var out1 = null;");
Object m = engine.get("out");
Object m1 = engine.get("out1");

获取m == null和m1 == null。

如何确定值是未定义还是空?


2
engine.eval("out === undefined") 返回什么? - chrylis -cautiouslyoptimistic-
3个回答

6

实际上,知道脚本返回的对象是否为 undefined 的正确方法是通过询问 ScriptObjectMirror 来进行:

import jdk.nashorn.api.scripting.ScriptObjectMirror;

Object m = engine.get("out");

if (ScriptObjectMirror.isUndefined(m)) {
    System.out.println("m is undefined");
}    

使用Nashorn内部API的另一种方法

您还可以通过检查其类型来实现:

import jdk.nashorn.internal.runtime.Undefined;

Object m = engine.get("out");

if (m instanceof Undefined) {
    System.out.println("m is undefined");
}

请注意,Nashorn没有将Undefined类型作为公共API的一部分,因此使用它可能会有问题(在发布版本之间可以进行更改),因此请改用ScriptObjectMirror。我在这里只是出于好奇加上了这个...

4

Java没有“未定义”的概念,因此理解这个区别需要用脚本语言来表达。我建议使用以下表达式:

Boolean isUndefined = engine.eval("out === undefined");

1
我添加了另一个答案,即使您不知道变量的名称,如果您从脚本的执行中获取了对象,或者只是不想运行脚本来了解这一点,它也可以工作。 它使用 ScriptObjectMirror.isUndefined( object ) - Renato

4

I'd check

engine.eval("typeof out") 

这将是"未定义的"

engine.eval("typeof out1") 

将会是“对象”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接