<div dir="ltr">I am not following. The object is immutable from their side, because they'll never be able to even access it since it's not referenced.<div><br></div><div>New syntax wouldn't solve anything I've talked about.</div><div><br></div><div>Have I misunderstood you?</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jan 15, 2017 at 12:51 PM, Alexander Jones <span dir="ltr"><<a href="mailto:alex@weej.com" target="_blank">alex@weej.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>IMO we should explore generalising syntax for map literals and object destructuring, bringing something like Immutable.Map into the spec, and thus bringing JS into a new modern era.</div><div><br></div><div>Otherwise people who care about this stuff will just continue to move to other languages like ClojureScript in order to get the expressivity and safety they want!</div><div><br></div><div><div class="gmail_quote"><div><div class="h5"><div>On Sun, 15 Jan 2017 at 10:34, Andrea Giammarchi <<a href="mailto:andrea.giammarchi@gmail.com" target="_blank">andrea.giammarchi@gmail.com</a>> wrote:<br></div></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5"><div class="m_8257730134344939976gmail_msg">I am not sure how feasible this concept is, and I'll start just with the pattern it's useful for.<div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">```js</div><div class="m_8257730134344939976gmail_msg">someRef.setup({</div><div class="m_8257730134344939976gmail_msg">  one: 'or more',</div><div class="m_8257730134344939976gmail_msg">  runtime: 'definition'</div><div class="m_8257730134344939976gmail_msg">});</div><div class="m_8257730134344939976gmail_msg">```</div><div class="m_8257730134344939976gmail_msg">In JS user-land, the amount of unnecessary duplicated objects is embarrassing.</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">We all know that immutability is great and we all know that functions should never mutate received arguments, but there is absolutely zero side effect in modifying, changing, erasing, you name it, an object passed like the one in that `.setup({...})`</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">As of today, basically every method used to setup one-off objects will use one of the following techniques:</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">  * a shallow copy via `Object.create(Object.<wbr>getPrototypeOf(options), Object.<wbr>getOwnPropertyDescriptors(<wbr>options))`</div><div class="m_8257730134344939976gmail_msg">  * an enumerable only copy via `Object.assign({}, options)`, probably more common but yet, most of the time, practically unnecesary</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">Things become even more difficult to improve when it comes to simply chaining objects together, where it's not possible to simply define the prototype of the received object, throwing away a performance boost possibility like the one Netfilx recently had [1]</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">Shortcutting and destructuring also makes the usage of one-off literals great, and states are the most basic, yet common, example.</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">```js</div><div class="m_8257730134344939976gmail_msg">component.setState({</div><div class="m_8257730134344939976gmail_msg">  label,</div><div class="m_8257730134344939976gmail_msg">  user,</div><div class="m_8257730134344939976gmail_msg">  time: Date.now()</div><div class="m_8257730134344939976gmail_msg">});</div><div class="m_8257730134344939976gmail_msg">```</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">## Back to the Reflect.hasExternalReference idea</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">Within the hypothetical `.setState(...)` method, invoking `Reflect.hasExternalReference` would return `true` it the object was passed as literal, without any possible external reference.</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">```js</div><div class="m_8257730134344939976gmail_msg">class Component {</div><div class="m_8257730134344939976gmail_msg">  setState(state) {</div><div class="m_8257730134344939976gmail_msg">    this.state = Reflect.hasExternalReference(<wbr>state) ?</div><div class="m_8257730134344939976gmail_msg">      Object.assign({}, this.state, state) :</div><div class="m_8257730134344939976gmail_msg">      Object.setPrototypeOf(state, this.state);</div><div class="m_8257730134344939976gmail_msg">    // update only differences</div><div class="m_8257730134344939976gmail_msg">    this.render(Object.keys(state)<wbr>);</div><div class="m_8257730134344939976gmail_msg">  }</div><div class="m_8257730134344939976gmail_msg">}</div><div class="m_8257730134344939976gmail_msg">```</div><div class="m_8257730134344939976gmail_msg">If there was a way to know passed literals, I am sure a lot of software could automatically boost performance:</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">  * less polluted GC</div><div class="m_8257730134344939976gmail_msg">  * more recycled one-off objects</div><div class="m_8257730134344939976gmail_msg">  * less need to copy/clone over and over one-off literals that couldn't be mutate anywhere else anyway</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">What do you think? Does any of this make sense?</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">Best Regards</div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg">[1] <a href="http://techblog.netflix.com/2017/01/crafting-high-performance-tv-user.html" class="m_8257730134344939976gmail_msg" target="_blank">http://techblog.netflix.<wbr>com/2017/01/crafting-high-<wbr>performance-tv-user.html</a></div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div><div class="m_8257730134344939976gmail_msg"><br class="m_8257730134344939976gmail_msg"></div></div><br><br></div></div>______________________________<wbr>_________________<br class="m_8257730134344939976gmail_msg"><br>es-discuss mailing list<br class="m_8257730134344939976gmail_msg"><br><a href="mailto:es-discuss@mozilla.org" class="m_8257730134344939976gmail_msg" target="_blank">es-discuss@mozilla.org</a><br class="m_8257730134344939976gmail_msg"><br><a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" class="m_8257730134344939976gmail_msg" target="_blank">https://mail.mozilla.org/<wbr>listinfo/es-discuss</a><br class="m_8257730134344939976gmail_msg"><br></blockquote></div></div>
</blockquote></div><br></div>