LoginSignup
6
2

More than 5 years have passed since last update.

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

Posted at

どういう事?

こういう事

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. 「くれぐれも悪用はせんようにな」の略 

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2