便利な配列やオブジェクトのリテラル・非同期処理・コレクションの反復処理・関数型プログラミングの概要
朝活が成功するとブログ更新ができるぞ!として、モチベーションを維持。
便利な配列やオブジェクトのリテラル
// 分割代入 const [n, m] = [1, 4]; // スプレッド構文 const arr1 = [ 'A', 'B', 'C' ]; const arr2 = [...arr1, 'D', 'E' ]; // [ 'A', 'B', 'C', 'D', 'E' ] const obj1 = { a: 1, b: 2, c: 3 }; const obj2 = {...obj1, d: 4, e: 5 }; // { a: 1, b: 2, c: 3, d: 4, e: 5 } // プロパティ名のショートハンド const foo = 65536; const obj = { foo, bar: 4096 }; // { foo: 65536, bar: 4096 }
非同期処理
ES6 から導入された Promise 構文だと↓
const sleep = ms => new Promise(resolve => setTimeout(resolve, mis)); const greet = () => { consoloe.log('おやすみ') sleep(2000) .then(() => { // 2000sec たったあとの処理 }) .catch(err => { // エラー処理 }) } greet();
sleep() 関数が Promise クラスオブジェクトを返して、 then() のメソッドチェーンでつなぐ。then() は複数つなぐこともできる。
finally
で例外のあるなしにかかわらず最後にかならず実行。
ES2017から導入された async/awasit
という構文だと↓
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); const greet = async() => { console.log('おやすみ'); try { await sleep(2000); // 処理 } catch (err) { // エラー処理 } } greet();
async
で定義した Async 関数は、本文中に await
を前置きすることで、他の Async 関数の実行結果を待つようになる。
Async 関数は暗黙のうちに Promise オブジェクトを返している。
コレクションの反復処理
関数型プログラミングについては経験がない。。 入力に対して同じ作用と同じ出力が保証されていること、が関数型プログラミングの良さ。これを参照透過性という。
const arr = [ 1, 2, 3, 4, 5, 6, 7, 8]; arr.map(n => n * 2); arr.filter(n => n % 3 === 0); arr.find(n => n > 4); arr.every(n => n != 0); // すべての要素が条件を満たすかを真偽値で返す arr.some(n => n > 8); // 条件を満たす要素がひとつでもあるかを真偽値で返す arr.includes(5); // 指定した要素が含まれるかを真偽値で返す arr.reduce((n, m) => n + m); // 配列の要素を、与えた式で畳み込んだ値を返す arr.sort((n, m) => n > m ? -1 : 1); // 与えられた比較関数(戻り値が -1: 前に移動、0: 移動しない、1: 後ろ に移動)によって並べ替えた新しい配列を返す
元の配列をいっさいいじらずに、新しい配列を生成して返す。
関数型プログラミングの概要
const arr = [ 1, 2, 3, 4, 5, 6, 7, 8]; const double = n => n * 2; arr.map(double) // arr.map(n => n * 2); と同じ結果
- 無名関数
- 変数に関数を代入できる(つまり、無名関数に名前をつけることができる)
- 高階関数(関数の引数に関数を渡したり、戻り値として関数を返す)
- 部分適用(関数に特定の引数を固定した新しい関数をつくる)
- 複数の高階関数を合成してひとつの関数にできる
:thinking: