Surprising Nashorn behavior for String methods

Andreas Rieber rieberandreas at gmail.com
Mon Oct 17 05:22:42 UTC 2016


Hi Sundar,

startsWith is part of ECMAScript:

http://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.startswith

Not widely supported...

cheers
Andreas


On 17/10/2016 06:48, Sundararajan Athijegannathan wrote:
> Hi,
>
> "startsWith" is non-standard extension (actually, it is Java method)
>
> jjs> "hello".startsWith
> [jdk.internal.dynalink.beans.OverloadedDynamicMethod
> java.lang.String.startsWith]
>
> "startsWith" is not an ECMAScript standard specified property of
> String.prototype.  In Nashorn, you can call methods of java.lang.String
> on JS strings.  "split" is an ECMAScript standard specified property of
> String.prototype and hence you find it as "function" valued property of
> String.prototype.
>
> HTH,
>
> -Sundar
>
>
> On 10/17/2016 2:20 AM, Esben Andreasen wrote:
>> Hi
>>
>> 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
>> ```
>>
>> Interpretation:
>>
>> 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
>> ```
>



More information about the nashorn-dev mailing list