2015-03-26 20 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ę ...

Powiązane problemy