I am not sure if this is a bug or feature of the Nashorn engine. But
it looks like some String-prototype methods are missing, yet the
methods are somehow present when used in the right way.

Minimal example: calling `startsWith` by using `call`:

1  $ jjs -v
2  jjs> String.prototype.startsWith.call('abc', 'ab')
3  <shell>:1 TypeError: Cannot read property "call" from undefined

Expected behavior:

Not a type error, for multiple reasons:

1. Other JavaScript engines do not throw a type error.
2. The equivalent code `"abc".startsWith("ab")` does not throw a type error.

Further investigation:

 1  $ jjs -v
 2  nashorn 1.8.0_101
 3  jjs> "abc".startsWith('ab')
 4  true
 5  jjs> "abc".startsWith
 6  [jdk.internal.dynalink.beans.OverloadedDynamicMethod
     boolean java.lang.String.startsWith(String,int)
     boolean java.lang.String.startsWith(String)
 7  jjs> "abc".startsWith.call("abc", "ab")
 8  <shell>:1 TypeError: "abc".startsWith.call is not a function
 9  jjs> typeof String.prototype.startsWith
10  undefined
11  jjs> String.prototype.split.call("abc", "b")
12  a,c


It looks like `startsWith` is not present on the String-prototype, yet
it is present on the String-primitives. Other String-prototype methods
(`split`) are however present.

Further notes:

This also applies to `String.prototype.endsWith`.

Related bug/feature: primitive values are not wrapped properly:

1  $ jjs -v
2  jjs> typeof Object("abc").startsWith
3  undefined


  • [no subject] Esben Andreasen

Reply via email to