The three logical assignment operators short-circuit, which means the right-hand side is not evaluated and the assignment does not happen at all when the operator does not fire.
a ||= b // assign if a is falsy
a &&= b // assign if a is truthy
a ??= b // assign if a is null or undefined
// the short-circuit is the point:
config.retries ??= expensiveDefault()
// expensiveDefault() does not run if retries is set
// and no assignment means no setter call, no proxy trap,
// and no mutation event — which a ternary would have fired
The difference from a = a || b is not brevity but that no write occurs, which matters for a property with a setter, a reactive proxy or a DOM element where assignment has a cost. ??= is the one to reach for by default: ||= treats an empty string and zero as absent, which is the same bug ?? was introduced to fix and is easy to reintroduce.