<div dir="auto"><div>Sorry to show up late but just wanted to point out that shipping this feature with the ! symbol would break TypeScript, which has this operator but only at compile time for forcing the compiler to believe that a nullable value will be non-null at the time of execution (assuming you have some information the compiler doesn't). It has no runtime effect of creating objects.<br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le mar. 5 mai 2020 07 h 36, Tobias Buschor <<a href="mailto:tobias.buschor@shwups.ch">tobias.buschor@shwups.ch</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I think that would work, but the many nested brackets bother me.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Am Mo., 27. Apr. 2020 um 14:23 Uhr schrieb Naveen Chawla <<a href="mailto:naveen.chwl@gmail.com" target="_blank" rel="noreferrer">naveen.chwl@gmail.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Can someone confirm if the following nullish coalescing assignment operator proposal example would work for this, or would it produce some other kind of result?:<div><br></div><div>```js</div><div>(((table ??= {}).user ??= {}).id ??= {}).type = 'int'</div><div>```</div><div>Regardless, I'm not a TC39 member but I would definitely be against forcing a type during assignment if "not already that type", as recommended in the original post. I think this could be a source of serious bugs in particular when an existing type structure has been miscalculated by the person using that "force type" operator. So regardless, I would prefer any shorthand to only assign to object/array etc. "if nullish". This would raise errors if already of an unexpected type, but I would much prefer that over forcing a new structure where an existing one already exists (and overwriting data).</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 27 Apr 2020 at 10:17, Max Fechner <<a href="mailto:max.fechner@gmail.com" target="_blank" rel="noreferrer">max.fechner@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div lang="EN-US">
<div>
<p class="MsoNormal"><span style="font-size:12pt;font-family:"Calibri Light",sans-serif">How about something like<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt;font-family:"Calibri Light",sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt;font-family:"Calibri Light",sans-serif">table{}.user{}.id{}.type = ‘int’<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt;font-family:"Calibri Light",sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt;font-family:"Calibri Light",sans-serif">this syntax could be used for arrays, too:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt;font-family:"Calibri Light",sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt;font-family:"Calibri Light",sans-serif">table{}.userList[].push(‘Jane Doe’)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt;font-family:"Calibri Light",sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt;font-family:"Calibri Light",sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt;font-family:"Calibri Light",sans-serif"><u></u> <u></u></span></p>
<div style="border-color:rgb(181,196,223) currentcolor currentcolor;border-style:solid none none;border-width:1pt medium medium;padding:3pt 0cm 0cm">
<p class="MsoNormal"><b><span style="font-size:12pt;color:black">From: </span></b><span style="font-size:12pt;color:black">es-discuss <<a href="mailto:es-discuss-bounces@mozilla.org" target="_blank" rel="noreferrer">es-discuss-bounces@mozilla.org</a>> on behalf of Jacob Bloom <<a href="mailto:mr.jacob.bloom@gmail.com" target="_blank" rel="noreferrer">mr.jacob.bloom@gmail.com</a>><br>
<b>Date: </b>Monday, 27April, 2020 at 02:23<br>
<b>To: </b>es-discuss <<a href="mailto:es-discuss@mozilla.org" target="_blank" rel="noreferrer">es-discuss@mozilla.org</a>><br>
<b>Subject: </b>Re: Proposal: Forced Chaining Operator "!."<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">(Sorry for the triple-post, I keep pondering this proposal) Come to think of it, you could do something pretty similar with the `??=` operator from the logical assignments proposal:
<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">```javascript<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">(((table ??= {}).user ??= {}).id ??= {}).type = 'int';<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">```<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">The main difference being that it tests for nullishness instead of whether the LHS is a non-null object, but I think that's within the spirit of the original proposal. It also lets you set a custom default value (like the "getsert" function
 above). The shortfall of course is the accumulating parentheses<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">On Sat, Apr 25, 2020 at 8:08 PM Jacob Bloom <<a href="mailto:mr.jacob.bloom@gmail.com" target="_blank" rel="noreferrer">mr.jacob.bloom@gmail.com</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-color:currentcolor currentcolor currentcolor rgb(204,204,204);border-style:none none none solid;border-width:medium medium medium 1pt;padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<p class="MsoNormal">Is the Perl syntax opt-in like the proposed operator? Or does it happen on all accesses to nulls? If it's opt-in in JS, then it doesn't seem to me that it'd cause too much unexpected behavior, though it could be argued that it's ripe for
 abuse by new devs trying to avoid errors.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Something that might be a more generalized middle ground (and could later assist in transpiling the !. operator) is a "getsert" (?) method in the standard library that takes a default value and sets it on the parent object if that property
 is currently unset:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">```javascript<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Object.getsert = (obj, identifier, defaultvalue) => {<br>
  if (!(identifier in obj)) obj[identifier] = defaultvalue;<br>
  return obj[identifier];<br>
}<br>
<br>
const table = {};<br>
console.log('before getsert:', table.user); // undefined<br>
console.log('during getsert:', Object.getsert(table, 'user', 5)); // 5<br>
console.log('after getsert:', table.user); // 5<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">```<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">...I have concerns about such a method's usability though, since a getsert is far more verbose than a normal get. It'd be more convenient on Object.prototype (e.g. `table.getsert('user', 5)` ), but I assume that's a no-go.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<p class="MsoNormal">Oh also, I think the proposed syntax would collide with TypeScript's non-null assertion operator <a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#non-null-assertion-operator" target="_blank" rel="noreferrer">https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#non-null-assertion-operator</a> --
 I don't know to what degree that's a concern when proposing new JS syntax<u></u><u></u></p>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">On Sat, Apr 25, 2020 at 3:00 PM Joe Eagar <<a href="mailto:joeedh@gmail.com" target="_blank" rel="noreferrer">joeedh@gmail.com</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-color:currentcolor currentcolor currentcolor rgb(204,204,204);border-style:none none none solid;border-width:medium medium medium 1pt;padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm">
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">Anyone have ideas on more examples? It’s tempting to make a transpiler plugin to see how it works in practice, but I’d like to see more examples first. Thanks<u></u><u></u></p>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">On Sat, Apr 25, 2020 at 1:12 PM Jacob Bloom <<a href="mailto:mr.jacob.bloom@gmail.com" target="_blank" rel="noreferrer">mr.jacob.bloom@gmail.com</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-color:currentcolor currentcolor currentcolor rgb(204,204,204);border-style:none none none solid;border-width:medium medium medium 1pt;padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm">
<div>
<p class="MsoNormal">Maybe it would be less footgunny to support autovivification in a more class-based way, like Python does?
<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">```javascript<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">class AutoVivArray extends Array {<br>
  [Symbol.getMissing](identifier) {<br>
    /* if we're here, identifier is not an ownProperty<br>
     * and is nowhere on the prototype chain */<br>
    this[identifier] = new Whatever();<br>
    return this[identifier];<br>
  }<br>
}<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">```<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Though I can't see how that's much more useful than Proxies besides saving you a little boilerplate<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">On Fri, Apr 24, 2020 at 3:23 PM Thomas Shinnick <<a href="mailto:tshinnic@gmail.com" target="_blank" rel="noreferrer">tshinnic@gmail.com</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-color:currentcolor currentcolor currentcolor rgb(204,204,204);border-style:none none none solid;border-width:medium medium medium 1pt;padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm">
<div>
<p class="MsoNormal"><span style="font-family:Arial,sans-serif">You are describing Perl's autovivification feature. Also possible (in that syntax) for arrays and mixed object/array chains. I liked it, but many saw it as a footgun. There was even a compile
 time module to turn off the feature, if the coder wanted more caution. Having mentioned Perl I will assume this is DOA?</span>  <u></u><u></u></p>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">On Fri, Apr 24, 2020, 14:36 Tobias Buschor <<a href="mailto:tobias.buschor@shwups.ch" target="_blank" rel="noreferrer">tobias.buschor@shwups.ch</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-color:currentcolor currentcolor currentcolor rgb(204,204,204);border-style:none none none solid;border-width:medium medium medium 1pt;padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<p class="MsoNormal">Since we now have the "Optional Chaninig Operator" , perhaps a "Forced Chaining Operator" would also be worth considering.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">I, personally, could use it:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><br>
    let table;<br>
    table!.user!.id!.type = 'int'<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">will evaluate to:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">    let table;<u></u><u></u></p>
</div>
<p class="MsoNormal">    if ( ! ( table instanceOf Object) ) table = {};<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal">    if ( ! ( table.user instanceOf Object) ) table.user = {};<br>
    if ( ! ( <a href="http://table.user.id" target="_blank" rel="noreferrer">table.user.id</a> instanceOf Object) )
<a href="http://table.user.id" target="_blank" rel="noreferrer">table.user.id</a> = {};<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    table.user.id.type = 'int';<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<p class="MsoNormal">Also to be noted:<u></u><u></u></p>
<div>
<p class="MsoNormal">Sometimes a fallback to `Object.create(null)` or something other might be desirable.<br>
But since `{}` is syntactical sugar for `Object.create(Object.prototype)`, this would be consistent.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div>
<p class="MsoNormal">_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank" rel="noreferrer">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank" rel="noreferrer">https://mail.mozilla.org/listinfo/es-discuss</a><u></u><u></u></p>
</blockquote>
</div>
<p class="MsoNormal">_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank" rel="noreferrer">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank" rel="noreferrer">https://mail.mozilla.org/listinfo/es-discuss</a><u></u><u></u></p>
</blockquote>
</div>
<p class="MsoNormal">_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank" rel="noreferrer">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank" rel="noreferrer">https://mail.mozilla.org/listinfo/es-discuss</a><u></u><u></u></p>
</blockquote>
</div>
</div>
</blockquote>
</div>
</blockquote>
</div>
</div>
</div>

_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank" rel="noreferrer">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank" rel="noreferrer">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>Freundliche Grüsse</div>Tobias Buschor<br><br>schwups GmbH<br>Hauptstr. 33<br>9424 Rheineck/SG<br><br>+41 76 321 23 21<br></div></div></div></div></div></div></div></div></div></div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank" rel="noreferrer">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div></div></div>