Usage of Java objects in JavaScript in Nashorn
suggest changeIt’s possible to pass Java objects to Nashorn engine to be processed in Java code. At the same time, there are some JavaScript (and Nashorn) specific constructions, and it’s not always clear how they work with java objects.
Below there is a table which describes behaviour of native Java objects inside JavaScript constructions.
Tested constructions:
- Expression in if clause. In JS expression in if clause doesn’t have to be boolean unlike Java. It’s evaluated as false for so called falsy values (null, undefined, 0, empty strings etc)
- for each statement Nashorn has a special kind of loop - for each - which can iterate over different JS and Java object.
- Getting object size. In JS objects have a property length, which returns size of an array or a string.
Results:
Type | If | for each | .length | — | — | — | — | Java null | false | No iterations | Exception | Java empty string | false | No iterations | 0 | Java string | true | Iterates over string characters | Length of the string | Java Integer/Long | value != 0 | No iterations | undefined | Java ArrayList | true | Iterates over elements | Length of the list | Java HashMap | true | Iterates over values | null | Java HashSet | true | Iterates over items | undefined |
Recommendatons:
- It’s advisable to use
if (some_string)
to check if a string is not null and not empty for each
can be safely used to iterate over any collection, and it doesn’t raise exceptions if the collection is not iterable, null or undefined- Before getting length of an object it must be checked for null or undefined (the same is true for any attempt of calling a method or getting a property of Java object)