<div dir="ltr">This is a great proposal which I hope can attract the support of the powers that be. The arrival of optional chaining seems to indicate a renewed interest in optimizing the way properties are accessed--which after all is a big part of what JS does for a living.<div><br></div><div>Using `.a` to denote a function to retrieve the value of the property named `a` was actually part of an earlier proposal for a number of ways to extend dot notation. I won't link to that proposal since it's obsolete now, but it also allowed</div><div><br></div><div>```</div><div>const getFirstName = .name.first;</div><div>```</div><div><br></div><div>With optional chaining syntax, this would presumably also be able to be written as `.name?.first`.</div><div><br></div><div>The earlier proposal also suggested extending this notation to arrays, so that</div><div><br></div><div>```</div><div>const head = .[0];</div><div>```</div><div><br></div><div>In case you are interested, the current version of the proposal for extended dot notation limits itself to accessing multiple properties with the syntax `.{a, b}`. It can be found at <a href="https://github.com/rtm/js-pick-notation/">https://github.com/rtm/js-pick-notation/</a>.</div><div><br></div><div>FWIW, the syntax `.propName` does appear to be syntactically unambiguous.</div><div><br></div><div>--</div><div>Bob</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Nov 24, 2019 at 4:51 PM <<a href="mailto:sup@aguz.me">sup@aguz.me</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>
<div name="messageBodySection">
<div dir="auto">Hi folks! I'd like to hear your feedback on a proposal idea I have and that I couldn't find anything on. Here is what I have so far.<br>
<br>
With the rising popularity of functional programming patterns in JavaScript, functions that take an object and return the value of a property are ubiquitous. These are some popular examples:<br>
<br>
```js<br>
// filtering by a boolean property<br>
const activeProducts = products.filter(product => product.active);<br>
<br>
// mapping<br>
const productNames = products.map(product => <a href="http://product.name" target="_blank">product.name</a>);<br>
<br>
// sorting, grouping, etc<br>
const sortedProducts = _.sortBy(products, product => <a href="http://product.name" target="_blank">product.name</a>);<br>
const { true: activeProducts, false: inactiveProducts } = _.groupBy(<br>
products,<br>
product => product.active<br>
);<br>
```<br>
<br>
This pattern is so common in fact that libraries like `lodash` (and frameworks) often also accept passing the name of the property as a string:<br>
<br>
```js<br>
const sortedProducts = _.sortBy(products, "name");<br>
```<br>
<br>
However, this technique has various problems:<br>
<br>
1. It requires extra code from the library authors. With its typical disadvantages.<br>
2. It has a potential negative impact on performance.<br>
3. It is not easily statically analyzable, which makes it hard to type-check, infer, and for tooling to catch typos.<br>
<br>
Several languages have solved these problems by introducing some syntactic sugar that simplifies the definition of these functions. My favorite example is Elm's: `.property` shorthand [1]. If JavaScript supported this syntax, we could write the previous examples as:<br>
<br>
```js<br>
const activeProducts = products.filter(.active);<br>
const productNames = products.map(.name);<br>
const sortedProducts = _.sortBy(products, .name);<br>
const { true: activeProducts, false: inactiveProducts } = _.groupBy(products, .active);<br>
```<br>
<br>
This is, in my opinion, nice to read and write. Besides, since this expression simply yields a function, it would not have any of the problems the string approach has.<br>
<br>
Combined with the pipeline operator proposal, it would allow code like the following:<br>
<br>
```js<br>
orders<br>
  |> filter(.active)<br>
  |> flatMap(.products)<br>
  |> .length<br>
```<br>
<br>
Lastly, engines might be able to optimize this further (or more easily) than normal functions since functions defined this way would be restricted to returning a constant property of the object that is passed to them. They would not be able to have any other expressions or statements in them. Unfortunately, they would not be considered automatically pure because users can implement side effects in property getters or Proxies.<br>
<br>
I could not think of any syntax ambiguity this could cause, but I would appreciate your thoughts in this regard. It does look similar to the RHS of a Member Expression, but it would not be ambiguous because the two would not be allowed under the same contexts. The F# community has had an interesting ongoing conversation [2] about the topic, but it is my understanding we would not have these problems in JavaScript since Call Expressions require parenthesis.<br>
<br>
[1] <a href="https://elm-lang.org/docs/syntax#records" target="_blank">https://elm-lang.org/docs/syntax#records</a><br>
[2] <a href="https://github.com/fsharp/fslang-suggestions/issues/506" target="_blank">https://github.com/fsharp/fslang-suggestions/issues/506</a><br>
<br>
I am looking forward to hearing your feedback!<br>
<br>
Agustín Zubiaga<br>
Head of Engineering @ PINATA<br></div>
</div>
</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>