@Andreas: But Nashorn on JDK 8 does not implement ECMAScript 6.
--emi On Mon, Oct 17, 2016 at 8:22 AM, Andreas Rieber <rieberandr...@gmail.com> wrote: > Hi Sundar, > > startsWith is part of ECMAScript: > > http://www.ecma-international.org/ecma-262/6.0/#sec-string.p > rototype.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 >>> ``` >>> >> >> >