Argument in favor of adding "has" in the WeakMap API
David Bruant
david.bruant at labri.fr
Wed May 11 13:24:39 PDT 2011
Le 11/05/2011 21:54, Brendan Eich a écrit :
> On May 11, 2011, at 12:44 PM, Oliver Hunt wrote:
>
>> So you want to do
>> if (map.has(bar))
>> wiffle = map.get(bar)
>>
>> or some such?
>>
>> The problem here is that you can't guarantee that GC won't happen between those two calls, and therefore you could still end up getting undefined in response to the get.
> Not if bar refers to the key object, since it must be a strong ref.
>
> If you do
>
> if (map.has(bar)) {
> bar = null;
> // might GC here, or do stuff that might
> wiffle = map.get(bar);
> . . .
> }
>
> then you get what you deserve.
>
>
>> GC is (from the language's perspective) non-deterministic, so any non-atomic operation with a weak map leads to "non-sensical" behaviour.
> True, but this does not apply to
>
> if (map.has(bar))
> wiffle = map.get(bar);
>
> as written.
Exactly. Said in another way, if you are able to call map.has(bar),
then, you hold a reference to bar, so the garbage collector cannot
consider collecting the object which bar references to (by definition of
"holding a reference").
As a side note, I didn't receive initial Olivier Hunt's e-mail. It
appears on es-discuss archive, but I didn't receive it. I am under the
impression that it's not the first time this happens to me. Am I the
only one in that case?
David
More information about the es-discuss
mailing list