Proposing a conditional assignment (or equals) operator

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Proposing a conditional assignment (or equals) operator

Doug Wade
I see this has been discussed on this list a number of times before -- I found this thread, and reviewed the linked discussions and previous strawmen (I hope that link is enough to establish context and why the operator is useful; I can provide more insight if it would be helpful).  I understand the problem is fraught and thorny, but I believe the language would greatly benefit from it.

I spent some time reflecting on what I think would be expected of such an operator (most notably that it be as close to the other assignment operators +=, -= &c. and the || operator as I could manage, and that it match the ||= operator in Ruby fairly closely) and wrote up a quick reference implementation (-ish? see babylon (parser) and babel (compiler)) and an set of test cases to match what I think expresses my thoughts on what I personally would expect from such an operator more eloquently than I think I could in words (please don't think me presumptuous; I thought it easier to write out my thoughts in code than English, not that the debate would be so simple that my implementation would be rubber stamped).

I have reviewed the process documentation and the contributing guide, and I believe I am seeking a TC39 champion to make this a stage 0 strawman proposal, though I will admit that from my review of the archives there is likely to be a lot of discussion before we reach that point.  Please advise me as to what more I can do to get this included in the ES standard.

All the best,
Doug Wade

_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss
Reply | Threaded
Open this post in threaded view
|

Re: Proposing a conditional assignment (or equals) operator

G. Kay Lee
Not convinced. Failed to see any reason why this proposal could force its way through this time after repeatedly being raised from dead only to be put down time after time. I don't see any new, convincing rationales here. On the other hand I can give out two reasons on why we don't need this thing fair quickly:

1.
```
// This is sooooo unambiguous everyone who knows programming can read this
const config = config || {};

// No true for this one as pointer out in previous discussions as well as the Ruby article you mentioned
const config ||= {};
```

2.
Honestly? Why are codes like this being written?

```
var config = {flag: true};
config = config || {};

...

function f (config) {
  const config = config || {};
}
```

I always write things like this:

```
var config = {flag: true} || {};

...

function f (config = {}) {
  ...
}
```

Can't remember any instance where I've written something like `x = x || {}` after the introduction of Default Parameters in ES6, so I don't see any chance for me writing something like `x ||= {}` even if this thing somehow makes its way in.

The thing is, it's far more common to encounter codes like `x = y || {}`, and then a new Default Operator would make sense due to the issue with falsy values. So I'd throw my support behind an authentic Default Operator proposal like `x = y ?? {}` (http://wiki.ecmascript.org/doku.php?id=strawman:default_operator). But definitely not `||=`.


On Tue, May 10, 2016 at 12:10 PM, Doug Wade <[hidden email]> wrote:
I see this has been discussed on this list a number of times before -- I found this thread, and reviewed the linked discussions and previous strawmen (I hope that link is enough to establish context and why the operator is useful; I can provide more insight if it would be helpful).  I understand the problem is fraught and thorny, but I believe the language would greatly benefit from it.

I spent some time reflecting on what I think would be expected of such an operator (most notably that it be as close to the other assignment operators +=, -= &c. and the || operator as I could manage, and that it match the ||= operator in Ruby fairly closely) and wrote up a quick reference implementation (-ish? see babylon (parser) and babel (compiler)) and an set of test cases to match what I think expresses my thoughts on what I personally would expect from such an operator more eloquently than I think I could in words (please don't think me presumptuous; I thought it easier to write out my thoughts in code than English, not that the debate would be so simple that my implementation would be rubber stamped).

I have reviewed the process documentation and the contributing guide, and I believe I am seeking a TC39 champion to make this a stage 0 strawman proposal, though I will admit that from my review of the archives there is likely to be a lot of discussion before we reach that point.  Please advise me as to what more I can do to get this included in the ES standard.

All the best,
Doug Wade

_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss



_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss
Reply | Threaded
Open this post in threaded view
|

Re: Proposing a conditional assignment (or equals) operator

Claude Pache

Le 10 mai 2016 à 09:44, G. Kay Lee <[hidden email]> a écrit :


Can't remember any instance where I've written something like `x = x || {}` after the introduction of Default Parameters in ES6, so I don't see any chance for me writing something like `x ||= {}` even if this thing somehow makes its way in.

Some people do have use cases despite default arguments, see e.g. https://esdiscuss.org/topic/is-much-needed#content-4


The thing is, it's far more common to encounter codes like `x = y || {}`, and then a new Default Operator would make sense due to the issue with falsy values. So I'd throw my support behind an authentic Default Operator proposal like `x = y ?? {}` (http://wiki.ecmascript.org/doku.php?id=strawman:default_operator). But definitely not `||=`.


Agree. I wonder why people keep to reclaim a `||=` operator (with semantics inspired from binary `||`), when their use cases generally show that `??=` is more appropriate (with approximate semantics of: `if (a === undefined) a = b;`).

—Claude

_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss
Reply | Threaded
Open this post in threaded view
|

Re: Proposing a conditional assignment (or equals) operator

Bruno Jouhier
In reply to this post by Doug Wade
A big +1. 

A quick grep on our code base shows 3000+ occurrences of the x = x || y idiom in 700+ files. This proposal would make this code more compact and more efficient, as it avoids redundant assignments.

The x = x && y idiom is a lot less common: 150 occurrences only, and is usually associated with questionable reuse of a polymorphic variable to walk a chain. But it would seem logical to extend the proposal to &&=.

Bruno

_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss
Reply | Threaded
Open this post in threaded view
|

Re: Proposing a conditional assignment (or equals) operator

Bruno Jouhier
In reply to this post by Doug Wade
`??=` is cleaner and avoids problems when the default is falsy but not undefined. But then we also need `??`.

_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss
Reply | Threaded
Open this post in threaded view
|

Re: Proposing a conditional assignment (or equals) operator

Isiah Meadows-2
Thought I'd mention this has been discussed before:


Currently, here's what I've seen emerge out of these discussions as the most likely, each of them chainable:

1. `x ?? y` for `x != null ? x : y`
2. `x??y` or `x?.y` for `x != null ? x.y : undefined`

In #2, the operator works similarly for computed access, function calls, etc., like in `f?.(x)` equivalent to `f != null ? f(x) : undefined`

On Tue, May 10, 2016, 08:50 Bruno Jouhier <[hidden email]> wrote:
`??=` is cleaner and avoids problems when the default is falsy but not undefined. But then we also need `??`.
_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss