36
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

タイムリープTypeScript 〜TypeScript始めたてのあの頃に知っておきたかったこと〜Advent Calendar 2021

Day 7

console.log(typeof null)の出力結果に自信のない人は読んでください

Last updated at Posted at 2021-12-06

タイムリープTypeScript 〜TypeScript始めたてのあの頃に知っておきたかったこと〜 の7日目の記事になります。
よろしくお願いします。

問題

突然ですが問題です。
下記のコードの出力結果は何になるでしょうか?

console.log(typeof null);

正解は、、、"object" です。
"null"じゃないの?って思った方がこの記事の読者です♪

なぜなのか

初期から存在するJavascriptのバグ1です。
嘘だと思うかもしれませんが、本当なんです。
どういうことなのか説明します。

初期のJavascriptでは、値を32bitで表現していました。
最初の3bitでデータのタイプを表現し、残りのbitでデータを表現していました。
イメージとしてはこんな感じでしょうか。
image.png

そして、データのタイプとしては下記の5つが定義されていました。

  • 000: object
  • 1: int
  • 010: double
  • 100: string
  • 110: boolean

お気付きでしょうか?nullがありません。
実は、nullはタイプとして定義されておらず、objectタイプのデータがすべて0という形で表現されていました。
そのため、タイプとしては存在しないのです。
イメージとしてはこんな感じです。
image.png

ではnullはobjectなのかというと、そういう意図でこの実装になっている訳ではないようです。
ではどういう訳かというと、Javascriptの最初のバージョンで納期に追われて生まれたバグだそうです。2
その後、修正する流れもあったようなのですが、互換性の問題などから修正されずに現在に至るそうです。3
そのため、typeof null"object"となる訳です。

以上になります。
最後までお読みいただきありがとうございました。

  1. bugという表現はThe history of “typeof null”の表現を拝借しています。

  2. The history of “typeof null”の下記の表現を拝借しています。

    This may seem like a very obvious bug, but don’t forget that there was very little time to finish the first version of JavaScript.

  3. typeof_nullとリンク先の表現を拝借しています。

    ECMAScript の修正案が (オプトインを使用して) 提案されましたが、却下されました。それは typeof null === 'null' という結果になるものでした。

36
11
1

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
36
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?