What is the difference between the nullish coalescing operator and the double-bar operator?
The double-bar operator falls back when the left side is falsy, and falsy covers six values: false, zero, the empty string, null, a missing value and not-a-number. The nullish coalescing operator falls back only for null and a missing value, and nothing else.
That difference is the whole point, and it matters because zero, the empty string and false are legitimate values in most domains. A price of zero is not the same as a price you do not know. A count of zero is not the same as a count you have not loaded yet. An empty search string is a real answer, not an absent one.
So the rule is to use the nullish operator whenever the value is a number, a string or a boolean that could legitimately be empty, and to use the double-bar only when every falsy value should be treated as absent. In practice, the nullish operator is the safer default for defaults and fallbacks, because it never destroys real data.
There is one more difference to know. The nullish operator cannot be mixed with the double-bar or the double-ampersand in the same expression without parentheses, because the precedence would be ambiguous. That restriction was added deliberately to stop people writing a mixed expression and getting a result they did not expect.