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