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

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

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

「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で赤線なりで警告してくれるから便利だよ。