背景
twitterで以下のコードを見た。
('b' + 'a' + + 'a' + 'a').toLowerCase()
> "banana"
あ~NaNが関わってるやつね~!わはは!
JavaScriptあるある~!あはは!あは...ん?え?なんで?(疑問)
調査
JavaScriptは少し知っているので、NaNが関係しているジョークだとは理解できたが、真ん中あたりのプラスが NaN に置き換わるとした場合、何故 bananaa
(aが2つ)を返さないのか?
と疑問に思ったため、Chromeで実際に実行してみた。
結果、以下のように + ‘a’
の部分が丸々 NaN
に置き換わり、文字列化して ‘baNaNa’.toLowerCase()
という出力だと理解できた。
+'a'
> NaN
では、なぜ +‘a‘ が NaN になるのか?
調べてみると、JavaScriptには単項プラス演算子、というものが存在するようだ。
5年くらい業務で書いていたが全く知らなかった。
用途は数値変換用。文字列でも変換可能なら数値に変換するとのことだが、数値に変換できない場合はNaNが返る。
+'12345'
> 12345 // 数値に変換してくれる
+'test'
> NaN // 数値に変換できないので NaN が返ってくる
単項プラスの優先度は加算より高いため先に処理される。
結論
単項プラス演算子を知っていれば笑うことができたネタだった。
一つ賢くなった。わっはっは。
('b' + 'a' + + 'a' + 'a').toLowerCase()
-> ('b' + 'a' + NaN + 'a').toLowerCase()
-> ('baNaNa').toLowerCase()
-> 'banana'
引用元
twitter.com/ryanels4/status/1805439977557225648?s=46&t=Ts9q1dl1k6E85syc_FvwxQ
参考文献
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Unary_plus
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Operator_precedence