TL;DR
- JavaScript には
null
,undefined
の他にもいくつか falsy な値がある -
||
で短絡評価させる場合、 falsy な値なら何でも[falsyな値] || [default]
で結果が[default]
になる - Nullish Coalescing の
??
を使う場合、null ?? [default]
,undefined ?? [default]
においてのみ、結果が[default]
になる
falsy な値
JavaScript には、Boolean コンテキストでは false と評価されるような値がいくつかあります。false
は当然そうですが、他にも**null, undefined, 0, NaN, ""
**などがあります。
短絡評価はこの性質を利用したものです。
null || "Hello World!" // "Hello World!"
undefined || "Hello World!" // "Hello World!"
false || "Hello World!" // "Hello World!"
0 || "Hello World!" // "Hello World!"
NaN || "Hello World!" // "Hello World!"
"" || "Hello World!" // "Hello World!"
これを利用して、「変数 hoge
に、もし正しく値が入っていなかったら、デフォルトで fuga
を使う」というような意図で hoge || fuga
というコーディングをすることがありました(どれほど一般的なのかはよく分かりませんが、私は記憶にあります)。
しかし、null
, undefined
ならともかく、数字の 0
や空文字の ""
を「正しく値が入っていない」とみなすのは、状況によっては不適切です。
Nullish Coalescing
TypeScript 3.7 では Optional Chaining のような素晴らしいシンタックスが入りましたが、その他にも、Nullish Coalescing というものが入りました。Nullish Coalescing は、いわば、短絡評価を null と undefined に制限したものです。
null ?? "Hello World!" // "Hello World!"
undefined ?? "Hello World!" // "Hello World!"
false ?? "Hello World!" // false
0 ?? "Hello World!" // 0
NaN ?? "Hello World!" // NaN
"" ?? "Hello World!" // ""
こちらの方がより意図に適っている場合が多いと思います。