Null 傳導運算符
程實務中,如果讀取對象內部的某個屬性,往往需要判斷一下該對象是否存在。比如,要讀取message.body.user.firstName
,安全的寫法是寫成下面這樣。
const firstName = (message
&& message.body
&& message.body.user
&& message.body.user.firstName) || 'default';
這樣的層層判斷非常麻煩,因此現在有一個提案,引入了“Null 傳導運算符”(null propagation operator)?.
,簡化上面的寫法。
const firstName = message?.body?.user?.firstName || 'default';
上面代碼有三個?.
運算符,只要其中一個返回null
或undefined
,就不再往下運算,而是返回undefined
。
“Null 傳導運算符”有四種用法。
obj?.prop
// 讀取對象屬性obj?.[expr]
// 同上func?.(...args)
// 函數或對象方法的調用new C?.(...args)
// 構造函數的調用
傳導運算符之所以寫成obj?.prop
,而不是obj?prop
,是為了方便編譯器能夠區分三元運算符?:
(比如obj?prop:123
)。
下面是更多的例子。
// 如果 a 是 null 或 undefined, 返回 undefined
// 否則返回 a.b.c().d
a?.b.c().d
``
// 如果 a 是 null 或 undefined,下面的語句不產生任何效果
// 否則執行 a.b = 42
a?.b = 42
``
// 如果 a 是 null 或 undefined,下面的語句不產生任何效果
delete a?.b