メインコンテンツまでスキップ

データ型

JavaScript の値には、大きく分けて「プリミティブ型」と「参照型」の 2 種類があります。

プリミティブ型(基本型)

プリミティブ型は 全部で 7 種類 あり、単純な値そのものを表します。

  1. 数値型(Number)

    let num = 42; // 整数
    let float = 3.14; // 小数
    let infinity = Infinity; // 無限大
    let notANumber = NaN; // Not a Number(数値ではない)
  2. 文字列型(String)

    let str1 = "二重引用符の文字列";
    let str2 = '一重引用符の文字列';
    let str3 = `テンプレートリテラル: ${num}`; // 変数を埋め込み可能
  3. 論理型(Boolean)

    let isTrue = true;
    let isFalse = false;
  4. 未定義(undefined) — まだ値が割り当てられていない状態

    let undefinedVar;
    console.log(undefinedVar); // undefined
  5. ヌル(null) — 「値が無い」ことを意図的に表す

    let emptyValue = null;
  6. シンボル(Symbol) — ES6 で追加された一意の値

    let uniqueKey = Symbol('description');
  7. BigInt — 大きな整数を扱う型

    let bigNumber = 1234567890123456789012345678901234567890n;
undefined と null の違い

undefined は「まだ値を入れていない(システムが自動的に設定する)」状態、null は「値が無いことを開発者が意図的に示す」状態です。どちらも「値が無い」ですが、使う場面が異なります。

参照型(オブジェクト型)

参照型は、複数の値やより複雑なデータ構造を持つことができます。

  1. オブジェクト(Object)

    let person = {
    name: "田中",
    age: 30,
    isStudent: false
    };
  2. 配列(Array)

    let fruits = ["りんご", "バナナ", "オレンジ"];
  3. 関数(Function)

    function greet() {
    return "こんにちは!";
    }
初級者向け解説

プリミティブ型は単純な値そのものを表し、参照型は複数の値をまとめて扱えます。プリミティブ型はコピーすると値そのものが複製されますが、参照型はコピーすると「同じ実体を指す参照」が共有される、という違いもあります。

型の確認方法

typeof 演算子を使うと、値の型を文字列で確認できます。

console.log(typeof 42); // number
console.log(typeof "hello"); // string
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
console.log(typeof null); // object (歴史的なバグ。下記参照)
console.log(typeof {}); // object
console.log(typeof []); // object (配列もオブジェクトの一種)
console.log(typeof function(){}); // function

null と配列の正しい判定

typeof では null も配列も "object" になってしまうため、判定には別の方法を使います。

// null かどうかは === で判定する
const value = null;
console.log(value === null); // true

// 配列かどうかは Array.isArray() で判定する
console.log(Array.isArray([1, 2, 3])); // true
console.log(Array.isArray({})); // false
typeof null が "object" になる理由

これは JavaScript 初期の実装に由来する 歴史的なバグ です。値の内部表現には型を示すタグが付いており、オブジェクトのタグが 0null0 で表現されていたため「オブジェクト」と判定されてしまいました。すでに大量のコードがこの挙動に依存しているため、後方互換性のために修正されずに残っています。null 判定には value === null を使いましょう。

次に読む

  • 条件分岐 — データ型ごとの値を使って処理を分岐させる