2015-03-26 9 views
6

biegnę ten kodRóżnią wartości null i niezdefiniowanych w 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"); 

i uzyskiwanie m == null i M1 == null.

Jak ustalić, czy wartość jest niezdefiniowana, czy zerowa?

+2

Co oznacza "engine.eval (" out === undefined ")' return? – chrylis

+0

to zwraca true –

Odpowiedz

4

Java nie ma pojęcia "niezdefiniowane", więc zrozumienie tego rozróżnienia będzie wymagało wyrażenia go w języku skryptu. Proponuję za pomocą tego wyrażenia:

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

Dodałem kolejną odpowiedź, która działa, nawet jeśli nie znasz nazwy zmiennej, jeśli obiekt został wycofany z wykonywania skryptu lub po prostu nie chcesz uruchamiać skryptu po prostu wiedzieć to. Używa 'ScriptObjectMirror.isUndefined (object)'. – Renato

4

bym sprawdzić

engine.eval("typeof out") 

który będzie "nieokreślone" i

engine.eval("typeof out1") 

byłoby "obiekt"

+1

patrz także http://stackoverflow.com/a/30533897/86485 –

4

Faktycznie, poprawny sposób sprawdzenia, czy obiekt zwracany przez skrypt to undefined, to pytanie: ScriptObjectMirror :

import jdk.nashorn.api.scripting.ScriptObjectMirror; 

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

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

Alternatywny sposób, używając Nashorn wewnętrznego API

Można również zrobić to poprzez sprawdzenie jego typ:

import jdk.nashorn.internal.runtime.Undefined; 

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

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

Zauważ, że Nashorn nie zrobić część Undefined typ public API, więc używanie go może być problematyczne (można je zmienić między wydaniami), więc zamiast tego użyj ScriptObjectMirror. Dodałem to tutaj jako ciekawostkę ...