You’re right. I was referring to behavior of the typeof operator.

Hannes

> Am 17.08.2016 um 08:45 schrieb Attila Szegedi <szege...@gmail.com>:
> 
> It doesn’t… Null is its own type in JS. The typeof operator returns the 
> string “object” for a null value as per http://es5.github.io/#x11.4.3, but 
> that’s (weird JS) special-casing. Internally, Null is a type with one value, 
> null.
> 
> 
>> On 17 Aug 2016, at 07:56, Hannes Wallnöfer <hannes.wallnoe...@oracle.com> 
>> wrote:
>> 
>> It’s unfortunate JS considers null to be of type ‚object‘. I think that in 
>> most practical circumstances and definitely when a number comes from a Java 
>> primitive you can omit the null check as Java primitives can’t be null, 
>> though.
>> 
>> Hannes
>> 
>> 
>>> Am 16.08.2016 um 16:16 schrieb João Paulo Varandas 
>>> <joaovaran...@inpaas.com>:
>>> 
>>> Hi Hannes.
>>> 
>>> Thanks for reviewing this. Seeing it from this perspective:
>>> 
>>> Longs are just like JS Number wrappers.
>>> 
>>> Made me believe the situation was not that bad too. Telling developers to 
>>> 'unwrap' numbers using " x = Number(x); " would not be a bad idea.
>>> 
>>> With that in mind, any number comparison would have to be made unwrapping 
>>> data first ... But, we would also need to test nulls first, because:
>>> 
>>> While "null == 0" yields false, and obviusly "null === 0" yields false.
>>> Number(null) === Number(0) would yield true.
>>> 
>>> Thus, we would need:
>>> 
>>> function unwrapNumber(x) {
>>>   return x == null ? null : Number(x);
>>> }
>>> 
>>> And also, to tell developers to call unwrapNumber() everytime they need to 
>>> compare a Number ... 
>>> 
>>> I don't know if you agree with me, but now I see this as an anti-pattern.
>>> 
>>> 
>>> ---
>>> 
>>> Anyway... It seems that all the fuzz is because of that "bug" with Long 
>>> numbers and double. And I'm sorry that I did not look further into that 
>>> issue.
>>> 
>>> Maybe we should look further into that, and try to make that any number 
>>> below Number.MAX_SAFE_INTEGER (9007199254740991), work the way is expected 
>>> inside JS evaluations ... 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>>     João Paulo Varandas
>>> +55 11 99889-2321
>>> joaovaran...@inpaas.com
>>> 
>>> 
>>> 2016-08-16 6:23 GMT-03:00 Hannes Wallnöfer <hannes.wallnoe...@oracle.com>:
>>> After exploring various options I don’t think there’s anything we can do to 
>>> go back and treat longs like numbers in Nashorn.
>>> 
>>> The ECMA spec is quite clear that there are numbers and object, and 
>>> comparison of the latter is by reference, not value. So having some kind of 
>>> in-between states is not really an option. Making longs numbers again would 
>>> be quite a small and harmless change within the language (without reverting 
>>> to longs as internal data type). Precision would be lowered to doubles for 
>>> large longs, but that wouldn’t be a problem for most users.
>>> 
>>> However, the problems starts where longs as numbers inherit from 
>>> Number.prototype. Of course, all methods in Number.prototype are specified 
>>> for double values, and the toString methods collides with toString in 
>>> java.lang.Long. Having a toString method that rounds large longs to the 
>>> nearest double value is a no-go. Nor is extending all methods in 
>>> Number.prototype to handle longs are viable options.
>>> 
>>> There is one issue we need to fix to improve handling of longs and other 
>>> instances of java.lang.Number though (thanks to Attila for first pointing 
>>> this out): Currently, java.lang.Numbers not treated as numbers in the 
>>> ToPrimitive operation with Number hint. This means less-than/greater-than 
>>> operators will treat those number objects as strings instead of converting 
>>> to double. I filed a bug for this, and will back port it to JDK 8u:
>>> 
>>> https://bugs.openjdk.java.net/browse/JDK-8163945
>>> 
>>> All things considered, there are some things that make me think the 
>>> situation is not as bad as some seem to believe. For one, the new treatment 
>>> of Longs (with the fix for the bug above) is consistent with how JavaScript 
>>> Number objects/wrappers are treated. Comparing two Number wrappers for the 
>>> same value will also evaluate to false with both == and === operators, 
>>> while comparing them to the primitive number with == will evaluate to true.
>>> 
>>> new Number(1) == new Number(1) // false
>>> new Number(1) === new Number(1) // false
>>> new Number(1) == 1 // true
>>> new Number(1) === 1 // false
>>> 
>>> So Longs are just like JS Number wrappers. They are object wrappers for 
>>> numeric values. If needed they can easily converted to primitive numbers by 
>>> calling the global Number() function without „new“ keyword, eg:
>>> 
>>> if (typeof x === „object“)
>>>    x = Number(x);
>>> 
>>> This is a common pattern in JavaScript even without Java longs, so I think 
>>> it’s acceptable.
>>> 
>>> Hannes
>>> 
>>> 
>>>> Am 05.08.2016 um 15:45 schrieb Hannes Wallnöfer 
>>>> <hannes.wallnoe...@oracle.com>:
>>>> 
>>>> Hi Joao Paulo,
>>>> 
>>>> thanks for the report.
>>>> 
>>>> We do realize that this change caused problems for a lot of people, and we 
>>>> are sorry for that, and thinking how we can improve things.
>>>> 
>>>> I still think we were right to remove longs as internal number 
>>>> representation. But maybe we went to far with this, and should allow 
>>>> people to deal with longs as numbers, assuming they are all right with an 
>>>> eventual loss of presentation.
>>>> 
>>>> This needs some discussion and thinking and experimentation. I’ll get back 
>>>> to you after the weekend.
>>>> 
>>>> Hannes
>>>> 
>>>> 
>>>> 
>>>>> Am 05.08.2016 um 04:40 schrieb João Paulo Varandas 
>>>>> <joaovaran...@inpaas.com>:
>>>>> 
>>>>> By the way, I just found out some bugs filed about Long objects:
>>>>> https://bugs.openjdk.java.net/browse/JDK-8162771
>>>>> https://bugs.openjdk.java.net/browse/JDK-8161665
>>>>> 
>>>>> And a twitter discussion:
>>>>> https://twitter.com/provegard/status/755010492112986112
>>>>> 
>>>>> I'd like to bring this up again if we have more room for discussion ...
>>>>> --
>>>>> 
>>>>> 2 Long values returned from a database and sent to a javascript 
>>>>> evaluation code can't be compared the way it should in JavaScript...  If 
>>>>> I have some validation code, I don't know if the source is some 
>>>>> JavaScript input (number), or the source is a database query 
>>>>> (object/Long/Integer/Double).
>>>>> 
>>>>> It's really hard to decide when sometimes x==y should be compared as 
>>>>> x.equals(y) and sometimes not... and sometimes, at the same point in code 
>>>>> I should do a lot of conditional operations, to resolve a simple 
>>>>> comparison... and that comparison does not work if the data source is a 
>>>>> Java object or a JavaScript object.
>>>>> 
>>>>> The problem with the current solution is that comparison between 
>>>>> different types would never work ...
>>>>> 
>>>>> Seeing that
>>>>> jjs> new java.lang.Long(2147483648) == "2147483648"
>>>>> returns true
>>>>> 
>>>>> But
>>>>> jjs> new java.lang.Long(2147483648) == new java.lang.Long(2147483648)
>>>>> returns false
>>>>> 
>>>>> Is something really hard to accept ...
>>>>> And that "equals" approach will work ONLY if I compare Long to Long. And 
>>>>> I see this as a regression when talking about evaluating JavaScript code.
>>>>> 
>>>>> 
>>>>> 
>>>>> Sorry about the long post, but I would really appreciate if we could 
>>>>> revalidate this and think about what the current situation represents 
>>>>> from ecmascript's point of view.
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> -08-04 22:43 GMT-03:00 João Paulo Varandas <joaovaran...@inpaas.com>:
>>>>> Sorry Tomas.
>>>>> 
>>>>> Either you did not read the message(which would be indeed a beginner's 
>>>>> mistake), or you are misleading the discussion.
>>>>> 
>>>>> What you said, about equality and references would be true if we were 
>>>>> talking about Java code. This is jdk8-nashorn's mailing list and I'm 
>>>>> talking about JavaScript evaluation inside the JVM.
>>>>> 
>>>>> 
>>>>> Comparison operators inside the script engine follow JavaScript rules and 
>>>>> not Java rules.
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>>     João Paulo Varandas
>>>>> +55 11 99889-2321
>>>>> joaovaran...@inpaas.com
>>>>> 
>>>>> 
>>>>> 2016-08-04 20:08 GMT-03:00 Tomáš Zíma <to...@tzima.cz>:
>>>>> A classical beginner's mistake. You are using Java objects and comparing 
>>>>> references, not the values, so this is expected behavior. Simply compare 
>>>>> the objects using equals().
>>>>> 
>>>>> 
>>>>> On 4.8.2016 15:48, João Paulo Varandas wrote:
>>>>> Hi guys!
>>>>> 
>>>>> It seems that version 1.8.0_101 has a bug in equality for same java data
>>>>> types (java.lang.Long).
>>>>> 
>>>>> Check that:
>>>>> jjs> new java.lang.Long(10) == new java.lang.Long(10)
>>>>> false
>>>>> 
>>>>> Oops!?
>>>>> 
>>>>> See the gist:
>>>>> https://gist.github.com/joaovarandas/51567bd3b576d48a4c574d60d5a60ba3
>>>>> 
>>>>> The results for all types should be ...
>>>>> ==    true
>>>>> ===   true
>>>>> equals true
>>>>> 
>>>>> But for java.lang.Long and java.math.BigDecimal:
>>>>> ==    false
>>>>> ===   false
>>>>> equals true
>>>>> 
>>>>> Maybe we could expand the test to other classes too, but the issue ...
>>>>> - It does happen in 1.8.0_101.
>>>>> - It does not 1.8.0_91.
>>>>> - It does happen with other classes (BigDecimal).
>>>>> - It does not happen with String.
>>>>> - It does not happen with Integer.
>>>>> 
>>>>> 
>>>>> I understand this is not an expected behavior. For now I'm rolling back
>>>>> to 1.8.0_91 in my environments.
>>>>> 
>>>>> 
>>>>> 
>>>>> Do you me to file a bug?
>>>>> 
>>>>> Thanks
>>>>> J
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> "Esta mensagem, incluindo seus anexos, pode conter informacoes 
>>>>> confidenciais e privilegiadas.
>>>>> Se voce a recebeu por engano, solicitamos que a apague e avise o 
>>>>> remetente imediatamente.
>>>>> Opinioes ou informacoes aqui contidas nao refletem necessariamente a 
>>>>> posicao oficial da Plusoft."
>>>>> 
>>>>> "Antes de imprimir, pense em sua responsabilidade e compromisso com o 
>>>>> MEIO AMBIENTE"
>>>> 
>>> 
>>> 
>>> 
>>> "Esta mensagem, incluindo seus anexos, pode conter informacoes 
>>> confidenciais e privilegiadas. 
>>> Se voce a recebeu por engano, solicitamos que a apague e avise o remetente 
>>> imediatamente. 
>>> Opinioes ou informacoes aqui contidas nao refletem necessariamente a 
>>> posicao oficial da Plusoft."
>>> 
>>> "Antes de imprimir, pense em sua responsabilidade e compromisso com o MEIO 
>>> AMBIENTE"
>>> 
>> 
> 

Reply via email to