関数の引数で引数に{}というものがありなんじゃろ?と思った
ので備忘録メモ
js-primeのオブジェクトの[ES2020] Optional chaining演算子(?.) のところ。
printWidgetTitle({
// タイトルが定義されてない空のオブジェクト
});
こんな記述があって、引数に{}ってなんだろ?と思ったら見た目通りオブジェクトだったというお話。
試した感じ
関数 testの処理で、引数をオブジェクトと想定し、そのプロパティ「hoge」をconsole.logしてみて見比べた。
引数の{}を消したら、ちょっとエラーが変わります。
function test(argument) {
console.log(argument.hoge)
}
test({}); // -> undefined になる。
test(); // -> Error: argument is undefined になる。
前者はオブジェクトはあるけど中身がundefinedだよ!
後者はそもそも引数であるオブジェクトがないよ!という感じでしょうか。
js-primeにもあるOptional chaining演算子(?.) を使った場合
function test(argument) {
console.log(argument?.hoge)
}
test({}); // -> undefined になる。
test(); // -> undefined になる。
と、どちらもundefinedとなります。
ドット記法(.)だと例外を発生してしまいますが、この書き方(?.)ならそのプロパティ自体が見つからない場合も、undefinedにしてくれます。
if文を使わずにかけます。
ついでにNullish coalescing演算子(??) を使った場合
最終的に何も見つからない場合の処理をかけます。
function test(argument) {
console.log(argument?.a ?? "ないです")
}
test({}); // ないです になる
test(); // ないです になる
//ちなみにちゃんとオブジェクト渡すパターン
test(
{
a:"ややや",
b:"よよよ"
}
)//やややになる