??
是一種邏輯運算子,只有當左側的值為 null
或 undefined
才會回傳右側的值,換句話說 ??
會讓左側所有被定義好的值保留下來,不多說直接看 Code 感覺一下。
const foo = null ?? 'nullish' // 'nullish'
const bar = undefined ?? 'nullish' // 'nullish'
const baz = '' ?? 'nullish' // ''
const qux = 0 ?? 'nullish' // 0
const quux = NaN ?? 'nullish' // NaN
const quuz = false ?? 'nullish' // false
??
和 ||
是不是看起來有 87% 像?那那個 13% 不一樣的地方在哪裡呢?我們來比較一下
leftExpr | operator | rightExpr | result |
---|---|---|---|
null | ` | ` | |
null | ?? |
'default' | 'default' |
undefined | ` | ` | |
undefined | ?? |
'default' | 'default' |
"" | ` | ` | |
"" | ?? |
'default' | "" |
0 | ` | ` | |
0 | ?? |
'default' | 0 |
false | ` | ` | |
false | ?? |
'default' | false |
NaN | ` | ` | |
NaN | ?? |
'default' | NaN |
對 null
, undefined
還有其他 truthy value 的處理。
兩者的差別在於對 falsy value 的處理 falsy value 指的是一個值在運算中會被判斷為 False 的值,在 JS 中 falsy value 只包含以下六種。
null
undefined
""
0
false
NaN
沒錯 {}
和 []
在 JS 中都是 truthy value
相比於 ||
,使用 ??
會保留 false
, ""
, "0"
& NaN
這四種 falsy value
||
的功能是去除掉所有 falsy value 同時給予一個 default 值。
所以只有當我們想要保留左側數值為 false
, ""
, "0"
& NaN
這些預先定義好的 falsy value 時,才一定要選擇使用 ??
,不然使用 ??
和 ||
從邏輯上其實是沒什麼差別的。
Nullish coalescing operator (??)
Nullish coalescing operator '??'
The Ultimate Guide to the ES2020 Nullish Coalescing Operator