<p dir="ltr">Has anyone considering just making dot-property access return intermediate undefined or null values by default?</p>
<p dir="ltr">Not having to introduce new syntax would be a bonus. I'm trying to think of existing code that this would break and can't think of any good examples.</p>
<p dir="ltr">The only compatibility issue I have thought of so far is code that relies on an Error being thrown but also does not check the value:</p>
<p dir="ltr">```js<br>
let value;<br>
try { value = deep.deep.deep.prop; } catch (err) { /* ... */ }<br>
// use value without even a basic truthy test<br>
```</p>
<p dir="ltr"></p>
<p dir="ltr">On Fri, 30 Oct 2015, 06:07  <<a href="mailto:es-discuss-request@mozilla.org">es-discuss-request@mozilla.org</a>> wrote:<br>
</p>
<p dir="ltr"><br>
</p>
<blockquote><p dir="ltr">---------- Forwarded message ----------<br>
From: Laurentiu Macovei <<a href="mailto:laurentiu.macovei@gmail.com">laurentiu.macovei@gmail.com</a>><br>
To: Sander Deryckere <<a href="mailto:sanderd17@gmail.com">sanderd17@gmail.com</a>><br>
Cc: "<a href="mailto:es-discuss@mozilla.org">es-discuss@</a><a href="mailto:es-discuss@mozilla.org">mozilla.org</a> list" <<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a>><br>
Date: Thu, 29 Oct 2015 19:52:37 +0100<br>
Subject: Re: Re: Existential Operator / Null Propagation Operator</p>
<p 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">https</a><a href="https://github.com/Microsoft/TypeScript/issues/16">://</a><a href="https://github.com/Microsoft/TypeScript/issues/16">github.com</a><a href="https://github.com/Microsoft/TypeScript/issues/16">/Microsoft/</a><a href="https://github.com/Microsoft/TypeScript/issues/16">TypeScript</a><a href="https://github.com/Microsoft/TypeScript/issues/16">/issues/16</a></p>
<p dir="ltr">Is there a better place to propose it for `ES6`/`ES7` ?<br></p>
<p dir="ltr">This would be amazing operator!! Especially for `ES6`/`ES7`/`TypeScript`<br></p>
<p dir="ltr">```js</p>
<p dir="ltr">var error = a.b.c.d; //this would fail with error if a, b or c are null or undefined.</p>
<p dir="ltr">var current = a && a.b && a.b.c && a.b.c.d; // the current messy way to handle this</p>
<p dir="ltr">var currentBrackets = a && a['b'] && a['b']['c'] && a['b']['c']['d']; //the current messy way to handle this</p>
<p dir="ltr">var typeScript = a?.b?.c?.d; // The typescript way of handling the above mess with no errors</p>
<p dir="ltr">var typeScriptBrackets = a?['b']?['c']?['d']; //The typescript of handling the above mess with no errors</p>
<p dir="ltr">```</p>
<p dir="ltr">However I propose a more clear one - as not to confuse ? from the a ? b : c statements with a?.b statements:<br></p>
<p dir="ltr">```js</p>
<p dir="ltr">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.</p>
<p dir="ltr">var doubleDotsWithBrackets = a..['b']..['c']..['d'];</p>
<p dir="ltr">```<br></p>
<p dir="ltr">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.<br></p>
<p dir="ltr">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).<br></p>
<p dir="ltr">Two dots make it more clear, more visible and more space-wise so you understand what's going on.<br></p>
<p dir="ltr">This is not messing with numbers too - as is not the same case e.g.<br></p>
<p dir="ltr">```js</p>
<p dir="ltr">1..toString(); // works returning '1'</p>
<p dir="ltr">var x = {};</p>
<p dir="ltr">x.1 = {y: 'test' }; //fails currently</p>
<p dir="ltr">x[1] = {y: 'test' }; //works currently </p>
<p dir="ltr">var current = x[1].y; //works</p>
<p dir="ltr">var missing= x[2].y; //throws exception</p>
<p dir="ltr">var assume= x && x[2] && x[2].y; // works but very messy</p>
<p dir="ltr">```<br></p>
<p dir="ltr">About numbers two options: Your call which one can be adopted, but I recommend first one for compatibility with existing rules!</p>
<p dir="ltr">1. Should fail as it does now (`x.1.y` == `runtime error`)</p>
<p dir="ltr">```js</p>
<p dir="ltr">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.</p>
<p dir="ltr">```</p>
<p dir="ltr">2. Should work since it understands that is not a number calling a property from `Number.prototype`</p>
<p dir="ltr">```js</p>
<p dir="ltr">var err = x..1..y; // should work as well, resulting 'test' in this case</p>
<p dir="ltr">var err = x..2..y; // should work as well, resulting undefined in this case</p>
<p dir="ltr">```<br><br></p>
<p dir="ltr">With dynamic names:</p>
<p dir="ltr">```js</p>
<p dir="ltr">var correct1 = x..[1]..y; //would work returning 'test'</p>
<p dir="ltr">var correct2 = x..[2]..y; //would work returning undefined;</p>
<p dir="ltr">```<br></p>
<p dir="ltr">What do you think folks?<br><br></p>
<p dir="ltr">Best Regards,</p>
<p dir="ltr">Laurenţiu Macovei<br>
</p>
</blockquote>
<blockquote><blockquote><blockquote><blockquote><blockquote><blockquote><p dir="ltr"><br>
</p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>