then the method should be called "<i>getOrSetIfNotThere(obj, def)</i>" 'cause get() would mislead too much<div><br></div><div>looks to me we are also confusing falsy with undefined ... undefined is undefined and there's no reason to use a WeakMap to set undefined since I would expect the WeakMap itself to completely ignore the operation of "setting" (or relating the keyObject)</div>
<div><br></div><div>Of course if undefined it will always be undefined ... what the second argument could do instead is to relate <i>keyObject</i> with a defined value</div><div><br></div><div><font class="Apple-style-span" face="'courier new', monospace">var o = wm.get(obj) || def;</font></div>
<div><br></div><div>is not the same of</div><div><br></div><div><font class="Apple-style-span" face="'courier new', monospace">var o = wm.get(obj, def);</font></div><div><br></div><div>'cause in first case "<i>get(obj)</i>" could be any falsy value while in the second one <i>def</i> will be returned if obj was in the WeakMap and it could be falsy too but no || operator is used so you are sure that the value of "<i>o</i>" is the one you expected but never undefined ( unless <i>def</i> is undefined itself but then you don't need at all to pass it as second argument )</div>
<div><br></div><div>A "too magic get()" would mean no set is needed anymore so either you call the method differently, or something is wrong with the logic used with WeakMaps.</div><div><br></div><div>Said that, <i>has()</i> could be optimal for all those cases where you want to <i>set()</i> the <i>keyObject†</i>if not there yet.</div>
<div>This could be optimized in core too as few engines do already for similar operations and the resulting JS code would be:</div><div><br></div><div><font class="Apple-style-span" face="'courier new', monospace">if (!wm.has(obj)) {</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace">† wm.set(obj, def);</font></div><div><font class="Apple-style-span" face="'courier new', monospace">}</font></div><div><font class="Apple-style-span" face="'courier new', monospace">var o = wm.get(obj);<br>
</font><br></div><div>with <i>has()</i> the need for second <i>get()</i> argument would be kinda pointless except for all lazy devs out there (ahem ...!)</div><div><br></div><div>br</div><div><br><div class="gmail_quote">
On Mon, Jan 16, 2012 at 11:25 PM, Axel Rauschmayer <span dir="ltr"><<a href="mailto:axel@rauschma.de">axel@rauschma.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><div>Iím not sure how much this is needed for WeakMaps in particular, but when you nest data structures then itís handy to automatically create an entry if it is missing.</div></div></blockquote>
</div></div>