2015-03-26 4 views
6

Я бегу этот кодОтличаются нулевые и неопределенные значения в Nashorn

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"); 

И получать м == NULL и m1 == NULL.

Как определить, является ли значение неопределенным или null?

+2

Что означает 'engine.eval (" out === undefined ")' return? – chrylis

+0

возвращает true –

ответ

4

Java не имеет понятия «неопределенный», поэтому понимание различий потребует выражения его на языке скрипта. Я предлагаю использовать это выражение:

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

Я добавил еще один ответ, который работает, даже если вы не знаете имя переменной, если вы вернули объект из выполнения сценария или просто не хотите запускать скрипт просто знать это. Он использует 'ScriptObjectMirror.isUndefined (object)'. – Renato

4

Я бы проверить

engine.eval("typeof out") 

, который будет "неопределенным" и

engine.eval("typeof out1") 

будет "объект"

+1

см. Также http://stackoverflow.com/a/30533897/86485 –

4

На самом деле, правильный способ узнать, возвращается ли объект по сценарию undefined, задав ScriptObjectMirror :

import jdk.nashorn.api.scripting.ScriptObjectMirror; 

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

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

Альтернативный способ, с помощью Насхорн внутреннего 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. Просто добавил это здесь как любопытство ...

Смежные вопросы