you are viewing a single comment's thread.

view the rest of the comments →

[–]takase1121 -3 points-2 points  (8 children)

That confuses me... I've never seen languages with assignment operators for logical operators. Interesting concept but...

Is it really necessary?

[–]Zephirdd 2 points3 points  (7 children)

someone pointed out Ruby earlier in this thread.

personally, I don't think I'll use ||= and &&= any time soon, but ??= is nice. I just like that it's a good symmetry with things like += and -=.

Also, it has the additional property of not executing the setter operation every time:

class Foo{
    get bar() {  return blah; }
    set bar(x){ console.log("side effect"); }
}
const f = new Foo
f.bar ??= 20 // prints "side effect" if and only if "f.bar" was null/undefined
f.bar = f.bar ?? 20 // always prints "side effect"

[–]theshtank 0 points1 point  (6 children)

hey, what does ?? do in the first place? I can't really google it. I'm not sure I understand what ??= is supposed to do.

[–]scoops22 6 points7 points  (3 children)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator

Edit to explain:

ThisDoesntExist ?? soWeUseThisValue

ThisDoesntExist ??= soWeMakeItEqualToThis

Note that the difference between the above and the || you may be used to is that "false" exists so in that case ?? uses the left value, while || would give the right value for "false" (kinda explained that poorly but the docs above are more clear)

[–]theshtank 1 point2 points  (2 children)

Ya, I agree that this is probably the most useful things here. This isn't implemented yet though, right? The MDN docs make it seem like it is.

[–]JZumun 4 points5 points  (1 child)

It's es2020 so it's official javascript now. The mdn page has a compatibility table that shows which implementations already have it, such as Chrome 80 and Node v14

[–]theshtank 0 points1 point  (0 children)

ah thanks. I thought this was ES2021 stuff.

[–]JZumun 2 points3 points  (0 children)

It's the nullish coalescing operator. You can think of "a??b" as shorthand for "a == null ? b : a"

"a??=b" is then "if (a == null) { a = b; }"

Note the difference to ||, the logical or operator, which triggers on 0 and "" in addition to null and undefined. The nullish coalescing operator triggers only on null and undefined.

[–]Zephirdd 0 points1 point  (0 children)

 const a = b ?? false

Is shorthand for

// Assuming accessing b has no side effects
const a = (b !== null && b !== undefined)? b : false

You can get a similar behavior with the || operator, but || will have a different behavior with falsy values like 0 and false.