JSでのラムダ式(アロー関数)とヨーダ記法についての雑感

このツイートとリプ欄のやり取りが面白かったので、雑に反応してみました。 こうしたかったんだろうなというコード 「xが5以上の場合」という判定をやりたかったんだろうなという推測を前提に話を進めます。 CLIから雑に動かして […]

広告ここから
広告ここまで

目次

    このツイートとリプ欄のやり取りが面白かったので、雑に反応してみました。

    こうしたかったんだろうなというコード

    「xが5以上の場合」という判定をやりたかったんだろうなという推測を前提に話を進めます。

    const x = 10
    if ( x >= 5 ) console.log(true)

    CLIから雑に動かしてみましょう。

    $ node
    > const x = 10
    
    > if ( x >= 5 ) console.log(true)
    true
    

    問題ないですね。

    実際にツイートで紹介されているコード

    続いて紹介されているコードx => 5を使ってみましょう。

    $ node
    > const x = 10
    
    > if ( x => 5 ) console.log(true)
    true
    

    おや、動きました。

    xの数字を5未満にしてみる

    今度は5未満でfalseになるかを試してみましょう。

    $ node
    > const x = 1
    
    > if ( x >= 5 ) console.log(true)
    undefined
    > if ( x => 5 ) console.log(true)
    true

    なにかがおかしいですね。

    x => 5は何者か

    元ツイで答えが出ていますが、これラムダ式(アロー関数)になっちゃってます。なのでifの中身だけをconsole.logで覗いてみるとこうなります。

    > console.log(x >= 5)
    false
    
    > console.log(x => 5)
    [Function]

    booleanじゃないものをif文の中身に入れてしまっていたということですね。このケース。

    ちなみにFunctionなのでこうすると動きます。

    > console.log((x => 5)())
    5

    ヨーダ記法なら回避できる説

    そして個人的に面白かったのが、リプライにてヨーダ記法について触れている方がいたことです。

    これは本当で、先程の2つをヨーダ記法で書き直すと一目瞭然です。

    $ node
    > console.log(5 >= x)
    true
    
    > console.log(5 => x)
    console.log(5 => x)
                ^
    
    SyntaxError: Unexpected number

    なぜヨーダ記法に反応したのか

    WordPressのコーディング規約では、ヨーダ記法を推奨しているですよね。

    ヨーダ記法はWordPress[1]Symfony[2]コーディング標準の一部に採用されている

    https://ja.wikipedia.org/wiki/%E3%83%A8%E3%83%BC%E3%83%80%E8%A8%98%E6%B3%95

    最近この書き方をしていなかったのですが、久々に見かけたのでつい反応しちゃいました。

    ちなみに

    TypeScriptならIDEで赤線なりで警告してくれるから便利だよ。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark