こちらの記事は以下の書籍を参考に執筆しました
#配列パラメータを分割する
2つのファイルの差分を取るプログラムを作成するとする。
diff関数は2つの引数に対して以下の3つの値を返す。
- 追加されたテキスト
- 削除されたテキスト
- 変更されたテキスト
function visualize(inserted,deleted,modified){
/*可視化した差分を画面に表示*/
}
const [inserted,deleted,modified]=diff(fileA,gileB);
visualize(inserted,deleted,modified);
もっとスキリさせた方法はこう
visualize(diff(fileA,gileB));
よってvisualize関数を再構築する。
function visualize(diff){
const inserted=diff[0];
const deleted=diff[1];
const modified=diff[2];
/*可視化した差分を画面に表示*/
}
配列の分割を使えばもっときれいになる。
function visualize(diff){
const [inserted,deleted,modified]=diff
/*可視化した差分を画面に表示*/
}
パラメータリストで分割できればもっと無駄がなくなる。
function visualize([inserted,deleted,modified]){
/*可視化した差分を画面に表示*/
}
#オブジェクトパラメータを分割する
diff関数を更新してinserted,deleted,modifiedの3つのプロパティを持つオブジェクトを返すようにした場合はどうなるか。
また、この新しいフォーマットからデータを抽出するようにvisualize関数を更新するとどうなるか。
function visualize({inserted,deleted,modified}){
/*可視化した差分を画面に表示*/
}
visualize(diff(fileA,fileB))
パラメータリストの角カッコ([])を波括弧にする。
つまり、配列の値をそれらの位置に基づいて取り出す代わりにオブジェクトのプロパティを実際のプロパティに基づいて取り出している。
ここで整理してみる。
分割 | 説明 |
---|---|
配列の分割 | 要素の位置が正しい限り好きな名前を使用できる。 |
オブジェクトの分割 | プロパティの名前が完全に一致している限りプロパティを好きな順序で取り出せる。 |
通常の配列とオブジェクトの分割がパラメータリストで実行されるだけ。
#名前付きパラメータをシミュレート
function car(make,model,year){
/*自動車を組み立てる*/
}
このパラメータをオプションにしてデフォルト値を設定したい。
3つめのパラメータにだけ設定する場合はどうするか。
パラメータリストでオブジェクトを分割すれば名前付きパラメータをシミュレートできる。
つまり位置ではなく名前で設定できる。
function car({make,model,year}){
/*自動車を組み立てる*/
}
let classic=car({year:1965})
しかし、これには問題がある。
このままyearだけを渡すと他のキーが書けたままになってしまう。
もっといい方法はこう
function car({make='Ford',model='Mustang',year=2017}){
/*自動車を組み立てる*/
}
//yearが設定されほかはデフォルト値が設定される。
let classic=car({year:1965})
オブジェクトを分割して各キーにデフォルト値を設定する。
これによりyearだけを渡しても他のパラメータはデフォルト値が入る。
後は引数を設定せずにcar関数を呼び出す。
function car({make='Ford',model='Mustang',year=2017}){
/*自動車を組み立てる*/
}
//不明なオブジェクトを分割市要素するためここでエラー
let classic=car()
この場合はcar({})のように呼び出す必要がある。
オブジェクトを渡さない場合、引数はundefinedになるため。
解決するためには各キーのデフォルト値として特定の値を指定するのではなく、パラメータ全体のデフォルト値としてからのオブジェクトを指定する。
function car({make='Ford',model='Mustang',year=2017}={}){
/*自動車を組み立てる*/
}
//すべてデフォルト値が設定される。
let classic=car()
//year以外はデフォルト値が設定される。
let classic=car({year:1965})