Обратите внимание: на рис. 12.2 показано, что достаточно большое число типов Java_данных, включая строки (экземпляры класса java.lang.String), в Java_ Script_сценариях преобразуются в объекты JavaObject, а не в значения элемен_ тарных типов данных, такие как строки. Это означает, что при использовании LiveConnect часто приходится работать с объектами JavaObject. Объекты JavaOb_ ject отличаются своим поведением от других JavaScript_объектов, поэтому вы должны знать о некоторых наиболее распространенных ловушках.
Первая странность в том, что чаще всего приходится работать с объектами Java_ Object, которые являются представлениями экземпляров java.lang.Double или других числовых типов. В большинстве случаев такого рода объект JavaObject ве_ дет себя подобно значению элементарного числового типа, но при использовании оператора сложения (+) следует быть начеку. Когда в операции сложения участ_ вует объект JavaObject (или любой другой JavaScript_объект), определяется стро_ ковый контекст операции, вследствие чего объект преобразуется в строку и вме_ сто операции сложения числовых значений выполняется операция конкатена_ ции строк. Чтобы выполнить явное преобразование, нужно объект JavaObject пе_ редать функции преобразования Number().
Чтобы преобразовать объект JavaObject в строковое JavaScript_значение, следует использовать функцию преобразования String(), а не вызывать метод toString(). Все Java_классы имеют унаследованный метод toString(), поэтому вызов метода toString() объекта JavaObject ведет к вызову Java_метода, а тот в свою очередь вернет другой объект JavaObject, в который будет обернут экземпляр ja_ va.lang.String, как показано в следующем фрагменте:
var
d
=
new java.lang.Double(1.234);
var
s
=
d.toString();
// Преобразует в java.lang.String,
а не в строку
print(typeof
s);
// Выведет "object", поскольку s –
это JavaObject
s =
String(d);
//
Теперь получится строка JavaScript
print(typeof
s);
//
Выведет "string".
Обратите внимание: JavaScript_строки имеют числовое свойство length. В то же время объект JavaObject, в который обернут экземпляр java.lang.String, также имеет свойство length, являющееся представлением метода length() объекта_ строки языка Java.
Другой странный случай – объект JavaObject класса java.lang.Boolean.FALSE. При использовании в строковом контексте значение этого объекта преобразуется в false, а при использовании в логическом контексте – в true! Это происходит по_ тому, что JavaObject не является значением null. Значение, хранящееся в этом объекте, просто не предназначено для такого рода преобразований.