JavaScript
小ネタ

【ネタ】console.log()の前にびっくりすると真になる話

どういう事?

こういう事

repl
> !console.log('aaaaa');
'aaaaa'
true

どうしてこうなるのか?

JavaScriptではfunctionの戻り値の定義がない(return文で値を返さない)場合、実行時にundefinedが返される。
そして実行環境が提供するconsole.log()などの機能には戻り値の定義がない。

undefinedは真偽値の求められる文脈ではfalseの様にとして扱える仕様になっているため、論理否定演算子であるエクスクラメーションマーク(!)の直後に出現すると真偽値として扱われ、結果的に式の評価がになる。

使いどころは?

こういう風に中間操作で副作用させるくらいしかない

repl
> [1, 2, 3, 4].filter(e => !console.log(e));
1
2
3
4
[1,2,3,4]

トリッキー過ぎなので製品コードに組み込むのはNG。
functionがundefinedを返してくれる事に依存するので、何か具体的な値が返るように仕様が変わると破綻する。
こんな書き方のコードが正式版に入ってたら見た人はびっくりするだろう。
いわゆる「くれ悪1」である。


  1. 「くれぐれも悪用はせんようにな」の略