<div dir="ltr">As a side note, this feature has recently been added to Ruby (<a href="https://bugs.ruby-lang.org/issues/11537">issue</a>). They use the "foo.?bar" syntax instead of "foo?.bar" because of a grammar conflict (ruby identifiers may end with an interrogation mark).<div><br></div><div>Is there something wrong with the "foo?.bar" syntax? It seems to be supported about anywhere (where this feature is implemented, at least), so anything else might be a bit confusing for most users.</div><div><br></div><div>The following language implement this feature and syntax: C#, Groovy, Swift, Ruby (with a twist)</div></div><br><div class="gmail_quote"><div dir="ltr">Le jeu. 29 oct. 2015 à 19:53, Laurentiu Macovei <<a href="mailto:laurentiu.macovei@gmail.com">laurentiu.macovei@gmail.com</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">Yes! I have updated my answer using markdown and also posted on the original issue of TypeScript. <a href="https://github.com/Microsoft/TypeScript/issues/16" target="_blank">https://github.com/Microsoft/TypeScript/issues/16</a><div>Is there a better place to propose it for `ES6`/`ES7` ?<br><div><br><div><div><div><div><div>This would be amazing operator!! Especially for `ES6`/`ES7`/`TypeScript`</div><div><br></div><div>```js</div></div></div></div></div></div></div></div><div dir="ltr"><div><div><div><div><div><div><div>var error = a.b.c.d; //this would fail with error if a, b or c are null or undefined.</div><div>var current = a && a.b && a.b.c && a.b.c.d; // the current messy way to handle this</div></div></div></div></div></div></div></div><div dir="ltr"><div><div><div><div><div><div><div>var currentBrackets = a && a['b'] && a['b']['c'] && a['b']['c']['d']; //the current messy way to handle this</div></div></div></div></div></div></div></div><div dir="ltr"><div><div><div><div><div><div><div>var typeScript = a?.b?.c?.d; // The typescript way of handling the above mess with no errors</div></div></div></div></div></div></div></div><div dir="ltr"><div><div><div><div><div><div><div>var typeScriptBrackets = a?['b']?['c']?['d']; //The typescript of handling the above mess with no errors</div></div></div></div></div></div></div></div><div dir="ltr"><div><div><div><div><div><div><div>```</div><div>However I propose a more clear one - as not to confuse ? from the a ? b : c statements with a?.b statements:</div><div><br></div></div></div></div></div></div></div></div><div dir="ltr"><div><div><div><div><div><div><div>```js</div><div>var doubleDots = a..b..c..d; //this would be ideal to understand that you assume that if any of a, b, c is null or undefined the result will be null or undefined.</div><div>var doubleDotsWithBrackets = a..['b']..['c']..['d'];</div><div>```</div><div><br></div><div>For the bracket notation, I recommend two dots instead of a single one as it's consistent with the others when non brackets are used. Hence only the property name is static or dynamic via brackets.</div></div></div></div></div></div></div></div><div dir="ltr"><div><div><div><div><div><div><div><br></div><div>Two dots, means if its null or undefined stop processing further and assume the result of expression is null or undefined. (as d would be null or undefined).</div><div><br></div><div>Two dots make it more clear, more visible and more space-wise so you understand what's going on.</div><div><br></div></div></div></div></div></div></div></div><div dir="ltr"><div><div><div><div><div><div><div>This is not messing with numbers too - as is not the same case e.g.</div><div><br></div><div>```js</div><div>1..toString(); // works returning '1'</div><div>var x = {};</div><div>x.1 = {y: 'test' }; //fails currently</div><div>x[1] = {y: 'test' }; //works currently </div><div>var current = x[1].y; //works</div><div>var missing= x[2].y; //throws exception</div><div>var assume= x && x[2] && x[2].y; // works but very messy</div><div>```</div><div><br></div><div>About numbers two options: Your call which one can be adopted, but I recommend first one for compatibility with existing rules!</div><div>1. Should fail as it does now (`x.1.y` == `runtime error`)</div><div>```js</div><div>var err = x..1..y; // should fail as well, since 1 is not a good property name, nor a number to call a method, since it's after x object.</div><div>```</div><div>2. Should work since it understands that is not a number calling a property from `Number.prototype`</div><div>```js</div><div>var err = x..1..y; // should work as well, resulting 'test' in this case</div><div>var err = x..2..y; // should work as well, resulting undefined in this case</div><div>```</div><div><br></div><div><br></div><div>With dynamic names:</div><div>```js</div><div>var correct1 = x..[1]..y; //would work returning 'test'</div><div>var correct2 = x..[2]..y; //would work returning undefined;</div><div>```</div></div></div></div></div></div></div></div><div dir="ltr"><div><div><div><div><div><div><div><br></div><div>What do you think folks?</div></div></div></div></div></div></div></div><div dir="ltr"><div><div><div><div><div><div></div><br></div></div></div></div></div></div><div class="gmail_extra"><br clear="all"><div><div><div dir="ltr"><div><font face="'comic sans ms', sans-serif">Best Regards,</font></div><div><font face="'comic sans ms', sans-serif">Laurenţiu Macovei</font></div></div></div></div></div><div class="gmail_extra">
<br><div class="gmail_quote">On Thu, Oct 29, 2015 at 7:29 PM, Sander Deryckere <span dir="ltr"><<a href="mailto:sanderd17@gmail.com" target="_blank">sanderd17@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><span>2015-10-29 19:22 GMT+01:00 Laurentiu Macovei <span dir="ltr"><<a href="mailto:alonecomp@gmail.com" target="_blank">alonecomp@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>This would be amazing operator!!</div><div><br></div><div>var error = a.b.c.d; //this would fail with error if a, b or c are null or undefined.</div><div>var current = a && a.b && a.b.c && a.b.c.d; // the current messy way to handle this</div><div>var typeScript = a?.b?.c?.d; // The typescript way of handling the above mess with no errors</div><div><br></div><div>However I propose a more clear one - as not to confuse ? from the a ? b : c statements with a?.b statements:</div><div><br></div><div>var x = a..b..c..d; //this would be ideal to understand that you assume that if any of a, b, c is null or undefined the result will be null or undefined.</div><div><br></div><div>Two dots, means if its null or undefined stop processing further and assume the result of expression is null or undefined. (as d would be null or undefined).</div><div><br></div><div>Two dots make it more clear, more visible and more space-wise so you understand what's going on.</div><div><br></div><div>What do you think folks?</div><div><br></div></div></blockquote><div><br></div></span><div>Do you also have a proposal on how to handle a["b"]["c"]["d"], so with possibly variable keys. <br><br></div><div>In any case, I think that the existential operator (whatever the exact sign used is) will be better then the current way of chaining &&.<br><br></div><div>Regards,<br></div><div>Sander <br></div></div><br></div></div>
</blockquote></div><br></div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div>