便利な配列やオブジェクトのリテラル・非同期処理・コレクションの反復処理・関数型プログラミングの概要

朝活が成功するとブログ更新ができるぞ!として、モチベーションを維持。

便利な配列やオブジェクトのリテラル

// 分割代入
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: