Proposal: spread assignment operator
Note: Object.assign
mutates its first argument and (with only obscure
caveats) does exactly this. Not sure syntax is necessary here.
Oh, and arrays also have the common idiom array.push(...values)
(but they
could use an Array.prototype.pushAll
to avoid polluting arguments lists).
An HTML attachment was scrubbed... URL: esdiscuss/attachments/20180425/16c607c5/attachment-0001
spread assignment not mutate, it reassign, like "+=" and other.
if ( ('a = {...a,...b}'.length > 'a ...= b'.length) === ('n = n+1'.length > 'n += 1'.length) ) { console.log('why "addition assignment" is necessary, but "spread assignment" is not?'); }
It doesn't. But with objects, it's not a cheap operation to simply duplicate, and they aren't normally immutable like primitives. Furthermore, why is it for objects, not arrays?
(I'm pushing that second question as a point of potential confusion - remember the user.)
An HTML attachment was scrubbed... URL: esdiscuss/attachments/20180425/b8986e7e/attachment-0001
I think it can be looks like: gist.github.com/artalar/ea8512546a3675648615a25e846096a6
By way of context, some similar ideas have been previously discussed:
esdiscuss.org/topic/picking-deconstructing-properties-into-object-literals
esdiscuss.org/topic/destructuring-an-object-into-a-new-object-like-underscore-pick-but-esier
esdiscuss.org/topic/extended-dot-notation-pick-notation-proposal
FWIW, I actually do like the idea of being able to syntactically "reshape"
one object or array directly into another, and there's probably even a
cowpath argument to be made on the basis of so many pick()
, omit()
,
etc. implementations out there. On the other hand, per Isiah's comments,
we're at least 90% there already with Object.assign(), so it seems like the
value proposition could/should be developed a bit more on this.
An HTML attachment was scrubbed... URL: esdiscuss/attachments/20180425/c6e98df2/attachment
I propose spread assignment operator:
var obj = { test1: 1 }; var anotherObj = { test2: 2 }; obj ...= { test2: 2 }; // == (obj = { ...obj, ...anotherObj }) // { test1: 1, test2: 2 } I'm surprised it wasn't in the original implementation