どういう事?
こういう事
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」である。
-
「くれぐれも悪用はせんようにな」の略 ↩