Hannes Wallnöfer
hannes.wallnoefer at oracle.com
Mon Oct 17 10:21:29 UTC 2016
Hi Esben,
> Am 17.10.2016 um 09:11 schrieb Esben Andreasen <esben at esbena.dk>:
>
> A.
> Where can I read about such non-ECMA-standard features in Nashorn?
>
https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions
I don’t think the string methods from java.lang.String are contained in that page because, as Attila said, it is a side effect of using java.lang.String as JS string representation and transparently exposing Java methods to scripts.
> B.
> ECMAScript 6 includes `String.prototype.startsWith`, but it is not
> supported by Nashorn in ES6-mode:
>
> ```
> 1 $ jjs -version --language=es6
> 2 nashorn 1.8.0_101
> 3 jjs> typeof String.prototype.startsWith
> 4 undefined
> ```
>
> And it is unclear whether Nashorn intends to support it yet
> (https://bugs.openjdk.java.net/browse/JDK-8066046).
> So, is it a deliberate omission?
We’ll only implement some ES6 features in the initial JDK 9 release, and the String methods are not among them.
Hannes
> ---
> Esben
>
> On Mon, Oct 17, 2016 at 7:44 AM Attila Szegedi <szegedia at gmail.com> wrote:
>
>> it’s a side effect of the fact that primitive strings values in Nashorn
>> are instances of java.lang.String, and the fact that with Nashorn you can
>> invoke methods on Java objects, therefore “startsWith” is a Java String
>> method.
>>
>> While Java methods also don’t inherit from Function.prototype (hence, you
>> can’t call “call” on them as you have correctly observed), implementations
>> of Function.prototype.call and .apply are actually coded so that they do
>> work on them with a not terribly obvious, but correct invocation:
>>
>> var sw = "".startsWith
>> Function.prototype.call.call(sw, "abc", "a")
>>
>> should return true. Note that since the expression fn.call.call is totally
>> unbound from the fn that produced it, you can use any “fn”; I usually use
>> “Function” for some semblance of clarity:
>>
>> Function.call.call(sw, "abc", "a")
>>
>> Finally, .startsWith is only present on primitive String values (as
>> they’re java.lang.String), not on JS String objects, that’s why you were
>> getting results you didn’t expect from “typeof Object(string).startsWith”
>>
>> HTH,
>> Attila.
>>
>>
>>> On 16 Oct 2016, at 13:42, Esben Andreasen <esben at esbena.dk> 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
>>> ```
>>>
>>> -
>>>
>>> Esben
>>
>>
More information about the nashorn-dev
mailing list