shorthand notation for attribute creation?

# Hemanth H.M (10 years ago)

Something like var foo = {}; foo.bar ||= 3 would be very useful.

But not sure how something like obj['name']['maxlength'] be reduced to shorthand check if 'name' is not defined.

# Andrea Giammarchi (10 years ago)

Unless I misunderstood your idea, ||= makes me naturally think about += so if

i += n; means i = i + n

then

o.name ||= value means o.name = o.name || value

and this would be, according with all these years in ES3, the least surprising behavior which is way different from checking if name is not defined.

Accordingly, I wonder ...

  1. what if name was inherited with a non falsy value ?
  2. what if name was defined as undefined ?
  3. should that silently fail if name was already defined ?
# Domenic Denicola (10 years ago)

There was very active discussion, probably around 1.5 years ago, about ||= vs. a proposed ?= (where x ?= yx = x !== undefined ? x : y).

From what I recall some of the major points of discussion were:

  • Should ?= use undefined as its sentinel, or work with either null or undefined? (This was before the behavior for default parameters was decided.)
  • Would adding ||= be an attractive nuisance, when people "should" be using ?= instead?
  • Given the existence of default parameters, and default destructuring values, are either of these even necessary?

The last point, I think, was what killed both ?= and ||=. They become much less necessary when you can write things like

function f(foo = true, { bar = 5, baz = "ten" } = {}) {
  console.log(foo, bar, baz);
}
# Andrea Giammarchi (10 years ago)

indeed as breaking new syntax anyway I'd rather use destructuring avoiding any possible ambiguity on ||=

# Brendan Eich (10 years ago)

Good memory. This is all at esdiscuss.org in the meeting notes, but I can't google for ||= to save my life, even in Verbatim mode. Anyone?

Of course the original proposal is still in strawman stage on the wiki:

strawman:default_operator

# Hemanth H.M (10 years ago)

I had this hunch that it was out there somewhere...hmm thank you guys!

I do agree default parameters, and default destructuring values is the way to go.