Re: Surprising Nashorn behavior for String methods
Hi Andreas, Well, it is as of ES 6.0. For the most part, Nashorn still is only 5.1 compliant with few ES6 items thrown in jdk 9. Also, my answer was generic in the sense that there are function properties available which are not in prototype [because of java extension]. -Sundar On 10/17/2016 10:52 AM, Andreas Rieber wrote: > 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 :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 :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 >>> ``` >> >
Re: Surprising Nashorn behavior for String methods
@Andreas: But Nashorn on JDK 8 does not implement ECMAScript 6. --emi On Mon, Oct 17, 2016 at 8:22 AM, Andreas Rieber 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 :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 :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 >>> ``` >>> >> >> >
Re: Surprising Nashorn behavior for String methods
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 :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 :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 ```
Re: Surprising Nashorn behavior for String methods
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 :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 :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 > ```
Surprising Nashorn behavior for String methods
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 :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 :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 ```