Also, FWIW,  since we’re talking about nanoseconds of performance, here, I 
think slightly better than:

    return this.#random || (this.#random = Math.random());

Is

    return (this.#random === undefined) ? this.#random = Math.random() : 
this.#random;

This is because in the former, the compiled code has to determine whether 
this.#random is coercible into a Boolean. At the very least, it has to do an 
"Is this an object and, if so, not undefined ==> true" test. From first 
principles, the ternary expression is going to be more efficient. It simply 
checks if the value at this.#random is the same as the global undefined value 
and, if not, returns that value. No extra tests necessary.

And at least with V8 theory == practice in this case (at least in all my 
tests). And yes, we're talking nanosecond here.

While this looks a bit like the null propagation operator would be applicable, 
it's really not. 

Also FWIW, if you get tired of seeing/typing undefined, we add _ to the global 
object which means the above can be written as:

    return (this.#random === _) ? this.#random = Math.random() : this.#random;

You might think that this would perform worse than the undefined but, in fact, 
for V8 it's identical -- undefined and _ are both just properties of the global 
object. I think this reads especially well in function calls where you want an 
undefined placeholder

  fooey(_, "whatever");

Visually, _ just says undefined to me.

----
Alex Kodat

From: es-discuss [mailto:[email protected]] On Behalf Of Andrea 
Giammarchi
Sent: Wednesday, September 13, 2017 2:31 AM
To: Steve Fink <[email protected]>
Cc: [email protected]
Subject: Re: Lazy evaluation

> The properties already existed, so defineProperty shouldn't modify the order 
> IIUC

well, nope. the property existed in the prototype, not in the object.

anyway, I guess private properties, that are a possible solution, will be 
transpiled through a WeakMap so that most likely anything discussed in here 
won't make sense and the future code would look like the following

```js
class A {
  #random;
  get random() {
    return this.#random ||
          (this.#random = Math.random());
  }
}


// transpiled
var A = function (wm) {
  function A() {
    wm.set(this, {random: void 0});
  }
  Object.defineProperties(
    A.prototype,
    {
      random: {
        configurable: true,
        get: function () {
          return wm.get(this).random ||
                (wm.get(this).random = Math.random());
        }
      }
    }
  );
  return A;
}(new WeakMap);
```



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

Reply via email to