のべラボ.blog

謙虚に、臆せず、さぼらずにブログを書く

モダンなJavaScriptのお勉強:アロー関数編

ひさびさに モダンな JavaScript のお勉強ネタを書きます。

今回は、アロー関数について勉強しています。 アロー関数は、ES2015から追加された関数の記述方法の一つです。

まず、従来の関数の記述方法をおさらいしておきましょう。

次のように、function のあとに関数名、そして( ) で囲んだ引数名を指定し、関数の処理は { } で囲みます。

function sayHello(yourname) {
    return "Hello! " + yourname;
}

console.log(sayHello("Nobe"));

このコードを実行すると、次のようになります。

結果:

Hello! Nobe

また、次のように関数を変数に代入して扱うこともできます。

const hellofunc = function sayHello(yourname) {
    return "Hello! " + yourname;
}
console.log(hellofunc("Nobe"));

このコードの実行結果は、最初のコード例と同じです。

結果:

Hello! Nobe

では、アロー関数の記述方法をみていきます。

アロー関数では、関数自体に名前を付けず、いきなり引数から記述するのが特徴です。

次の例では、(yourname) が関数の引数を表しています。 その後に => と記載し、関数内の処理を { }内に記載します。

(yourname) => { 
    return "Hello! " + yourname;
}

つまり、yourname という引数を受け取り、それに Hello という文字列を連結して return するという関数になります。 関数の名前はありませんが、次の例のように変数に代入して、変数名で呼び出すことができます。

const hello_arrow1 = (yourname) => { 
    return "Hello! " + yourname;
}
console.log(hello_arrow1("Nobe1"));

結果:

Hello! Nobe1

まずは、(引数) => { 関数の処理 } という基本形を覚えておくとよいでしょう。

ただ、アロー関数では、省略した記述ができるケースがあります。 例えば、引数が1つの場合は、次のように引数を囲んでいる ( )を省略できます。

// 引数が1つの場合は、() を省略できる
const hello_arrow2 = yourname => { 
    return "Hello! " + yourname;
}
console.log(hello_arrow2("Nobe2"));

結果:

Hello! Nobe2

逆にいうと、引数が複数の場合は、引数を囲む ( )は必須になります。

// 引数が複数の場合は、() が必要
const hello_arrow3 = (yourname,youraddress) => { 
    return "Hello! " + yourname + " in " + youraddress;
}
console.log(hello_arrow3("Nobe3","Kyoto"));

結果:

Hello! Nobe3 in Kyoto

その他の省略可能なルールとして、次の例をみてみましょう。

// 関数の処理が単一行でその結果をreturnする場合は、{} と return 句を省略できる
const hello_arrow4 = yourname => 
  "Hello! " + yourname;
console.log(hello_arrow4("Nobe4"));

結果:

Hello! Nobe4

本来は関数の処理として { return "Hello! " + yourname; } と記述するのですが、処理が単一行であれば、関数の処理を囲む { }return 句を省略できるので、このような記述になるわけです。

逆にいうと、処理が複数行になる場合は、次のように 関数の処理を囲む{ }は必須で、関数が値を返す場合は return 句も必要になります。

// 関数の処理が複数行になる場合は、{}が必要。return 句は省略できない
const hello_arrow5 = yourname => {
  const greeting = "Hello! ";
  return greeting + yourname;
}
console.log(hello_arrow5("Nobe5"));

結果:

Hello! Nobe5

次に、オブジェクトのように複数行を return する場合をみてみましょう。 この場合、return する値を ( ) で囲むことで、そのオブジェクトを return することになります。

// returnする内容が複数行になる場合は、() で囲む
const hello_arrow6 = (yourname,youraddress) => (
     {
        name:    yourname,
        address: youraddress
     }
)
console.log(hello_arrow6("Nobe6","Kyoto"));

結果:

{ name: 'Nobe6', address: 'Kyoto' }

まとめ


JavaScript ではなく、Java 言語のラムダ式をご存じの場合は、このアロー関数がよく似ていると感じるでしょう。 JavaScript のアロー関数にせよ、Java 言語のラムダ式にせよ、基本的な記述方法がわかっていれば、コードを読み解くことは難しくありません。 アロー関数では、基本的に => があれば、その左にあるものは引数、右にあるものが関数の処理本体として読み解くと良いでしょう。