データ型

データ型とは

データ型とは、データの種類のことをいいます。
例えば、データが「数値型」であれば四則演算で計算を行うことができますが、「文字列型」の場合は四則演算で計算を行うことができません。
JavaScriptではデータの種類を「プリミティブ(primitive)」と「オブジェクト(object)」の2つに分けられます。
これらのデータ型の値は リテラル といわれていて、変数や定数に格納して使用されます。

プリミティブ

プリミティブ(文字列や数値)は「不変(immutable)」という特徴があり、プリミティブのデータ型は次の5種類があります。
下記のようにデータ型により実行できる処理が異なります。

データ型 概要 データの例
数値型(Number) 整数値や浮動小数点値 10, 1.23
文字列型(String) 文字列 ‘Taro’, ‘123’
真偽型(Boolean) 真と偽のどちらかの値 true, false
null 値がないことを表す特殊な値 null
undefined 値が定義されていないことを表す特殊な値 undefined

この「不変」というのは「変数の値を変更できない」という意味ではありません。
下記のサンプルは文字列の中から一部の文字列を切り取っていますが、実行すると切り取り元のデータは変わっていないことが確認できます。

function myfunction() {
  var str = '12345';
  // 0文字目から3文字を切り出す
  var result = str.substr(0, 3);
  // 切り出した0文字目から3文字
  console.log(result);
  // 切り取り元のデータは変更されていない。
  console.log(str);
}

123
12345

このように プリミティブ型は置き換える(再代入)することはできますが、値をそのものを変更することはできません。
上記をプリミティブ型の特徴を念頭に置いて、各プリミティブ型の違いを確認していきましょう。

他のプログミング言語(Javaなど)では、変数宣言時に指定したデータ型以外の値を入れることができないものもありますが、
JavaScriptはデータ型については寛容です。
例えば、数値型のデータを格納していた変数に文字列型のデータを代入することも可能です。

数値型(Number)

数値型は整数や小数以外にも16進数を扱うことができます。
全角数値の場合やカンマが含まれている場合(例:1,000)は数値として扱われないため注意しましょう。

function outputNumber() {
  console.log(10);        // 10
  console.log(1.23);      // 1.23
  console.log(0xFFFF);    // 65535
  console.log(1000000000000000000000); // 1E+21
  console.log(0.0000001); // 1.0E-6
}

上記のサンプルを実行すると、「1E+21」や「1.0E-6」という結果が表示されます。
これらは 指数表現 といい、整数部の桁数が7桁以上、小数点の桁数が6桁以上の数値は指数表記となります。

また、数値と数値の間に四則演算子がある場合は計算が行われます。

function calNumber() {
  console.log(1 + 1); // 2
  console.log(2 - 3); // -1
}

文字列型(String)

JavaScriptでは文字列型の値を記述する場合はシングルクォーテーション(’)、またはダブルクォーテーション(")で囲います。
どちらを使ってもよいのですが、コーディングをする際はどちらかに統一するとコードが読みやすくなります。

また、シングルクォーテーションまたはダブルクォーテーションを文字列として使用したい場合は、
使用されていないクォーテーションで囲うことになります。

function outputString_1() {
  console.log('Hello "Taro"!'); // Hello "Taro"!
  console.log("I'm Taro");      // I'm Taro
}

改行やタブなどの特別な文字はバックスラッシュ(\)に指定文字を組み合わせることで表現することができます。
これを エスケープシーケンス といいます。

GASで使用できるエスケープシーケンスは下記の通りです。

エスケープシーケンス 概要
\n 改行
\r 復帰
\t タブ
\\ バックスラッシュ
\’ シングルクォーテーション
\" ダブルクォーテーション

試しに下記のサンプルでエスケープシーケンスを確認してみましょう。

function outputString_2() {
  /*
    Hello
    'GAS'!
  */
  console.log('Hello\n\'GAS\'!');
}

文字列は四則演算子の+で結合することができます。
下記のサンプルでは+の左辺と右辺を結合してひとつの文字列しています。
なお、左辺と右辺が数値の場合は加算の処理がなされる点には気をつけてください。
function outputString_3() {
  console.log('Hello ' + 'GAS'); // Hello GAS
  console.log('1' + '2'); // 12
  console.log(1 + 2); // 3
}

文字列の中に変数などの値を設定したい場合は、下記の通り「+」記号で文字列連結を行うことで実現できます。
function outputString_4() {
  var age = 50;
  var message = '私の年齢は' + age + '歳です。';
  console.log(message); // 私の年齢は50歳です。
}

上記のように文字列連結で実現できますが、
テンプレートリテラル を使用するとよりスマートに書くことができます。
function outputString_5() {
  var age = 50;
  var message = `私の年齢は${age}歳です。`;
  console.log(message); // 私の年齢は50歳です。
}

このようにテンプレートリテラルを使うと、変数などの値を文字列に埋め込むのがシンプルに書けます。
テンプレートリテラルは文頭と文末を「`」(バッククォート)で囲むことで使用できます。
テンプレートリテラルでは「$」を特別な値として扱っており、
変数や定数を「${}」で囲むことでその変数や定数の値を文字列に埋め込むことができます。
「${}」の中には計算式や関数を設定することで、その結果を埋め込むこともできます。
function outputString_6() {
  var age = 50;
  var message = `私の年齢は${age + 10}歳です。`;
  console.log(message); // 私の年齢は60歳です。
}

真偽型(Boolean)

真偽型 は、truefalseのいずれかの値で表現する値です。
「正しい(true)または誤り(false)」、「Yes(true)またはNo(No)」といったどちらかの結果のみ扱う場合に使用します。
真偽型は後々登場する条件式で活躍するため覚えておきましょう。
なお、JavaScriptでは次の値は偽(false)とみなされます。

  • undefined
  • null
  • false
  • 0
  • NaN
  • ‘’(空文字列)

null

null は値が存在しないことを意味します。

数値の「0」や文字列の「’’」も値が存在しないという意味をしているように思えますが、
厳密には「0」という数値、「’’」という文字列が存在しています。

一方で、nullは本当の意味で値が存在しないこと意味しています。

例えば、文字列型の変数の値がnullの場合は「変数に文字列は入っていない」という意味になります。
文字列型の変数の値が’‘の場合は「変数に空文字(’’)が入っている」という意味になります。

どういうときに使うかといいますと、後々代入する予定の変数を初期化する際に使われることがあります。
これができて何が嬉しいの?と思われると思いますが、後々解説する制御構文でその意味がわかると思います。

var num = null;

undefined

undefined は値が未定義であることを意味します。

例えば、下記のサンプルでは変数の宣言後に代入を行っていませんが、この変数のを参照するとundefinedとなっています。
どの変数も宣言して代入するまではundefinedの状態になります。

function outputUndefined() {
  var num;
  console.log(num); // undefined
}

オブジェクト

オブジェクトはプリミティブとは異なり、さまざまな形式や値をを取ることができる柔軟性があるデータです。
そのため、実装者にとって都合のよいオリジナルのデータ型を作ることができます。
JavaScriptにはオブジェクトのデータ型が用意されており、今回は下記の2点を次章以降で紹介します。

データ型 概要 データの例
配列型(Array) インデックスをキーとするデータの集合体 [1, 2, 3], [‘太郎’, 20, true]
オブジェクト型(Object) プロパティをキーとするデータの集合体 {name: ‘太郎’, age: 20, isStudent: true}

また、プリミティブ型の数値と文字列、論理値にはそれぞれオブジェクト型が存在しており、
数値はNumber型、文字列にはString、論理値にはBooleanが対応しています。
それぞれ、対応するプリミティブ型の機能を提供しています。