(Map|Set|WeakMap)#set() returns `this` ?

Andrea Giammarchi andrea.giammarchi at gmail.com
Tue Dec 4 17:30:32 PST 2012


as discussed before, the problem with setDefault() approach you are
suggesting is that the dict(), at least in JS, will be created in any case.

var newDict = a.setDefault(k1, dict());

above operation will invoke dict() regardless k1 was present or less and
this is not good for anyone: RAM, CPU, GC, etc

the initial pattern is and wants to be like that so that not a single
pointless operation is performed when/if the key is already there.

var o = obj.has(key) ? obj.get(key) : obj.set(key, dict()); // <== see
dict, never called if key

quick and dirty

var o = obj.get(key) || obj.set(key, dict());

With current pattern, and my only concern is that after this decision every
other `set()` like pattern will return this even where not optimal, I have
to do

var o = obj.has(key) ? obj.get(key) : obj.set(key, dict()).get(key);

meh ... but I can survive :D











On Tue, Dec 4, 2012 at 4:49 PM, Tab Atkins Jr. <jackalmage at gmail.com> wrote:

> On Mon, Dec 3, 2012 at 2:21 PM, Andrea Giammarchi
> <andrea.giammarchi at gmail.com> wrote:
> > IMHO, a set(key, value) should return the value as it is when you
> address a
> > value
> >
> > var o = m.get(k) || m.set(k, v); // o === v
> >
> > // equivalent of
> >
> > var o = m[k] || (m[k] = v); // o === v
>
> If this pattern is considered sufficiently useful (I think it is), we
> should handle it directly, as Python does.  Python dicts have a
> setDefault(key, value) method which implements this pattern exactly -
> if the key is in the dict, it returns its associated value (acts like
> a plain get()); if it's not, it sets the key to the passed value and
> then returns it.  Using this pattern is not only clearer, but avoids
> repetition (of "m" and "k" in your example), and actually chains - I
> use setDefault all the time when working with nested dicts.
>
> (For example, if I have a sparse 2d structure implemented with nested
> dicts, I can safely get/set a terminal value with code like
> "a.setDefault(k1, dict()).set(k2, v)".  If that branch hadn't been
> touched before, this creates the nested dict for me.  If it has, I
> create a throwaway empty dict, which is cheap.  If JS ever grows
> macros, you can avoid the junk dict as well.)
>
> I prefer the plain methods to work as they are currently specified,
> where they return this.
>
> ~TJ
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20121204/68d1a3c1/attachment.html>


More information about the es-discuss mailing list