Existential Operator / Null Propagation Operator (Laurentiu Macovei)
Steve Fink
sphink at gmail.com
Thu Oct 29 20:18:02 UTC 2015
Uh, isn't that a pretty large compatibility risk?
<input type='checkbox' onclick='doUntestedStuff(tihs.checked)'>
You're suddenly calling doUntestedStuff() where before it was harmlessly
erroring.
On 10/29/2015 12:30 PM, Ron Waldon wrote:
>
> Has anyone considering just making dot-property access return
> intermediate undefined or null values by default?
>
> 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.
>
> 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:
>
> ```js
> let value;
> try { value = deep.deep.deep.prop; } catch (err) { /* ... */ }
> // use value without even a basic truthy test
> ```
>
> On Fri, 30 Oct 2015, 06:07 <es-discuss-request at mozilla.org
> <mailto:es-discuss-request at mozilla.org>> wrote:
>
>
> ---------- Forwarded message ----------
> From: Laurentiu Macovei <laurentiu.macovei at gmail.com
> <mailto:laurentiu.macovei at gmail.com>>
> To: Sander Deryckere <sanderd17 at gmail.com
> <mailto:sanderd17 at gmail.com>>
> Cc: "es-discuss@ <mailto:es-discuss at mozilla.org>mozilla.org
> <mailto:es-discuss at mozilla.org> list" <es-discuss at mozilla.org
> <mailto:es-discuss at mozilla.org>>
> Date: Thu, 29 Oct 2015 19:52:37 +0100
> Subject: Re: Re: Existential Operator / Null Propagation Operator
>
> Yes! I have updated my answer using markdown and also posted on
> the original issue of TypeScript. https
> <https://github.com/Microsoft/TypeScript/issues/16>://
> <https://github.com/Microsoft/TypeScript/issues/16>github.com
> <https://github.com/Microsoft/TypeScript/issues/16>/Microsoft/
> <https://github.com/Microsoft/TypeScript/issues/16>TypeScript
> <https://github.com/Microsoft/TypeScript/issues/16>/issues/16
> <https://github.com/Microsoft/TypeScript/issues/16>
>
> Is there a better place to propose it for `ES6`/`ES7` ?
>
> This would be amazing operator!! Especially for
> `ES6`/`ES7`/`TypeScript`
>
> ```js
>
> var error = a.b.c.d; //this would fail with error if a, b or c are
> null or undefined.
>
> var current = a && a.b && a.b.c && a.b.c.d; // the current messy
> way to handle this
>
> var currentBrackets = a && a['b'] && a['b']['c'] &&
> a['b']['c']['d']; //the current messy way to handle this
>
> var typeScript = a?.b?.c?.d; // The typescript way of handling the
> above mess with no errors
>
> var typeScriptBrackets = a?['b']?['c']?['d']; //The typescript of
> handling the above mess with no errors
>
> ```
>
> However I propose a more clear one - as not to confuse ? from the
> a ? b : c statements with a?.b statements:
>
> ```js
>
> 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.
>
> var doubleDotsWithBrackets = a..['b']..['c']..['d'];
>
> ```
>
> 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.
>
> 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).
>
> Two dots make it more clear, more visible and more space-wise so
> you understand what's going on.
>
> This is not messing with numbers too - as is not the same case e.g.
>
> ```js
>
> 1..toString(); // works returning '1'
>
> var x = {};
>
> x.1 = {y: 'test' }; //fails currently
>
> x[1] = {y: 'test' }; //works currently
>
> var current = x[1].y; //works
>
> var missing= x[2].y; //throws exception
>
> var assume= x && x[2] && x[2].y; // works but very messy
>
> ```
>
> About numbers two options: Your call which one can be adopted, but
> I recommend first one for compatibility with existing rules!
>
> 1. Should fail as it does now (`x.1.y` == `runtime error`)
>
> ```js
>
> 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.
>
> ```
>
> 2. Should work since it understands that is not a number calling a
> property from `Number.prototype`
>
> ```js
>
> var err = x..1..y; // should work as well, resulting 'test' in
> this case
>
> var err = x..2..y; // should work as well, resulting undefined in
> this case
>
> ```
>
> With dynamic names:
>
> ```js
>
> var correct1 = x..[1]..y; //would work returning 'test'
>
> var correct2 = x..[2]..y; //would work returning undefined;
>
> ```
>
> What do you think folks?
>
> Best Regards,
>
> Laurenţiu Macovei
>
>
>
>
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20151029/452ddfc1/attachment-0001.html>
More information about the es-discuss
mailing list