JavaScriptのデータ型について

jsコード JavaScript

本シリーズでは、プログラミング言語を問わず重要、且つ基礎的な内容である「データ型」について、連載形式で「これでもか」というぐらいに詳しく説明していきます。
説明するデータ型は、プリミティヴとして用意されている7種類を対象としています。

今回は、その第一弾となります。

情報には形式(データ型)がある

「変数」とは、情報を入れておくための容器である。

JavaScriptの変数と定数について」の記事で、変数について上記のように説明しました。

しかし、一口に情報と言っても、情報には様々な形式があります。

  • 30という「年齢」情報を入れたいならば、
    let age= 30;
  • 太郎という「名前」情報ならば、
    let name = “太郎”;

と言った具合です。

JavaScript 初めの一歩」で学習したとおり、文字列の場合はクォーテーションで囲むのがルールでしたね。

では、上記の数値(整数)や文字列以外に、どのような形式の情報があるのでしょうか。

記憶ポイント!

情報の形式のことを、「データ型」と呼びます。

データ型の種類

前述の通り、情報には「データ型」という概念があります。
変数は「情報を入れておくための容器」であるため、中に入っているものが何なのかを的確に把握できなければなりません。

例えば、現実世界にも「コップ」という容器があります。
説明するまでもなく、これは「飲み物」という形式(データ型)のものを入れるための容器です。
さらに、「飲み物」にも様々な種類があります。

想像してみてください。
透明ではなく、蓋まで付いているため中身の見えないコップにストローが刺さっています。
これを差し出されたとしたら、どうしますか?

種類までは分からなくても「飲み物」であることは分かるはずですが、それでも中身が何なのか知らないままでは平気で飲めなくないですか?
テレビ番組などでも、中に何が入っているか明かさず手だけ入れて当てるゲームがありますね。
観ている側は面白いですが、やる方は怖いものです。

プログラミング言語の世界での容器である「変数」も、現実世界と同じように、中に入れられる情報の種類、形式を理解、認識しておきましょう。

プリミティヴとオブジェクト

JavaScriptのデータ型は、まず2種類に大別されます。

  • プリミティヴ
    原始的なデータ型の総称。
  • オブジェクト
    内部に複数情報を持ち得るデータ型の総称。「参照型」とも呼ばれる。

どちらも現時点では、実感を伴って理解することはできないかもしれませんが、この2種類に分けられることを頭に入れておいてください。

記憶ポイント!

データ型は「プリミティヴ」と「オブジェクト」の2種類に大別されます。

この考え方は、JavaScriptに限らず、「オブジェクト指向」プログラミング言語での多くで採用されているので、用語だけでもしっかり覚えておきましょう。

プリミティヴなデータ型とは

プリミティヴ(primitive)とは「原始的な」という意味です。

JavaScript言語におけるプリミティヴをもう少し具体的に表現すると、次のようになります。
※ JavaScript初学者は、現時点で「オブジェクト」、「メソッド」といった用語の意味を理解できている必要はありません。

オブジェクトでなく、メソッドを持たないデータ。
JavaScriptのプリミティヴ型は、7種類あります。

プリミティヴなデータ型一覧

  • 数値(number)
  • 長整数(bigint)
  • 文字列(string)
  • 論理値(boolean)
  • 未定義(undefined)
  • シンボル(symbol)
  • null(null)

「文字列」や「数値」は日常的に触れるものですが、それ以外は情報系の学習経験者でないとイメージが付きづらいかと思います。
しかし、安心してください。今は分からなくても、メニューに沿って学習を進める内、徐々に分かっていきます。
焦らず、着実に、知識と経験を積み重ねていってください。

【参考】プリミティヴ型とラッパーオブジェクト

この学習段階のタイミングでは難しい内容になるので、初学者の方は理解できなくともOKという意味で【参考】として補足しておきます。

プリミティヴとは「オブジェクトでなく、メソッドを持たないデータ」であると定義されています。
しかし、JavaScriptでプログラミングしていると、👆の定義とは矛盾する挙動が見られます。

例を提示します。

script.js
// 👇文字列リテラルからメソッドを呼び出している
console.log( "R2-D2".toLowerCase() );

// 👇数値リテラルからメソッドを呼び出している
console.log( (3.141592).toString() );

これらのコードをVSCodeなどの高機能エディタを使用して記述しても、構文エラーになりません。
実行してみると、結果は次の通りです。

実行結果
> r2-d2
> 3.141592

エラーもなく想定通りに実行されました。
この挙動の理由はJavaScriptの仕様にあります。

JavaScriptのプリミティヴデータ型そのものにメソッドはありませんが、実際には、JavaScriptエンジン (*1) がプリミティヴ値を一時的に包み込むオブジェクト(ラッパー・オブジェクト)を自動的に生成し、そのメソッドを呼び出します。

この仕組みを「オート・ボクシングAuto-boxing)と言います。

*1:良いかパダワン、JavaScriptエンジンとは、JavaScriptのコードを実行するためのプログラムじゃ。様々な種類がある。

主なJavaScriptエンジンを挙げておこう。

  • V8(Google)
  • SpiderMonkey(Mozilla)
  • Chakra(Microsoft)

ただし、undefinedとシンボル、nullは、自動的にはラッパー・オブジェクトが生成されず、次のように明示的にオブジェクトに変換する必要があります。エラーになるので覚えておきましょう。

script.js
// 👇文字列リテラルからシンボルオブジェクトを生成し、コンソールに表示
console.log( Symbol("Star Wars") );

また、undefinedとnullには、ラッパー・オブジェクトがありません

  • undefined
    • 「未定義」という意味。「変数は宣言されているが値が割り当てられていない」場合、または「関数が何も返さない場合」などに使用されます。
    • ラッパー・オブジェクトはありません。
  • null:
    • 値が「存在しない」ことを明示的に示すために使用されます。
    • ラッパー・オブジェクトはありません。

最後に

本記事についての質問、誤りの指摘、ご意見ご感想などありましたら、ぜひコメント頂ければ幸いです。

最後までお読みいただき、ありがとうございます。

『詳説 JavaScript』メニューに戻る

コメント

タイトルとURLをコピーしました