Rhino, typeof y autoboxing confusión
-
27-09-2019 - |
Pregunta
En una extensión del lado del servidor para SmartfoxServer (que utiliza Rhino) que tenía un pedazo de Javascript similar a esto:
response["xpos"] = properties.get("xpos");
send(JSON.stringify(response));
Esto provocó errores. ¿Que pasó? Dado que las propiedades es un Map
Java, cuando un número se pone en él, se autoboxed en un objeto java.lang.Double
. Por lo tanto, cuando se recuperan y almacenándolo en response["xpos"]
, el resultado no es un número Javascript regular, pero un tipo de JavaObject
java.lang.Double
. La función JSON.stringify
no estaba destinado a mango eso y se estrelló.
Me fijo con un corte como este:
response["xpos"] = 1.0 * properties.get("xpos");
send(JSON.stringify(response));
¿Hay una mejor manera?
Solución
Se puede utilizar Number(properties.get("xpos"))
, como en la siguiente sesión de consola interactivo:
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
Así es como las cadenas se convierten normalmente en Rhino de java.lang.String a cadenas JavaScript nativos también.