Rhino, typeof und Autoboxing Verwirrung
-
27-09-2019 - |
Frage
In einer serverseitigen Erweiterung für SmartFoxServer (die Rhino verwendet) hatte ich ein Stück Javascript ähnlich wie folgt aus:
response["xpos"] = properties.get("xpos");
send(JSON.stringify(response));
Dies verursachte Fehler. Was ist passiert? Da Eigenschaften ein Java Map
ist, wenn eine Zahl in sie gesetzt wird, wird es in ein java.lang.Double
Objekt autoboxed. Daher wird, wenn es zu holen und sie in response["xpos"]
speichert, ist das Ergebnis nicht regelmäßig Javascript Zahl, sondern ein JavaObject
vom Typ java.lang.Double
. Die JSON.stringify
Funktion wurde nicht Griff bedeutet, dass es abgestürzt ist.
Ich reparierte es mit einem Hack wie folgt aus:
response["xpos"] = 1.0 * properties.get("xpos");
send(JSON.stringify(response));
Gibt es einen besseren Weg?
Lösung
Sie können Number(properties.get("xpos"))
verwenden, wie in der folgenden interaktiven Konsolensitzung:
js> x=java.lang.Double(2)
2.0
js> typeof x
object
js> x instanceof java.lang.Double
true
js> y=Number(x)
2
js> typeof y
number
Dies ist, wie Strings ist in der Regel in Rhino von java.lang.String nativen JavaScript-Strings als auch umgewandelt werden.