Rhino, Typeof и путаница Autoboxing
-
27-09-2019 - |
Вопрос
В расширении сервера для SmartFoxServer (который использует Rhino) У меня был кусок JavaScript, похожий на это:
response["xpos"] = properties.get("xpos");
send(JSON.stringify(response));
Это вызвало ошибки. Что случилось? Потому что свойства это Java Map
, когда число вносятся в него, это автообоксируется в java.lang.Double
объект. Следовательно, при извлечении его и хранения его в response["xpos"]
, результат не является обычным номером JavaScript, а JavaObject
Тип java.lang.Double
. Отказ То JSON.stringify
Функция не должна была справиться с этим, и она разбилась.
Я исправил это с взлом, как это:
response["xpos"] = 1.0 * properties.get("xpos");
send(JSON.stringify(response));
Есть ли способ лучше?
Решение
Вы можете использовать Number(properties.get("xpos"))
, Как и в следующем интерактивном консольном сеансе:
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
Вот как строки обычно преобразуются в носорогах от Java.lang.String до родных строк JavaScript.