ECMAScript原始型

ECMAScript には 5 種の原始型(primitive type)があります。それらは Undefined、Null、Boolean、Number、String です。

typeof 演算子

typeof 演算子には、チェックする変数や値が 1 つの引数があります。例えば:

var sTemp = "test string";
alert (typeof sTemp);    // "string" と出力
alert (typeof 86);    // "number" と出力

変数や値に typeof 演算子を呼び出すと、以下の値のいずれかが返されます:

  • undefined - 変数が Undefined 型の場合
  • boolean - 変数が Boolean 型の場合
  • number - 変数が Number 型の場合
  • string - 変数が String 型の場合
  • object - 変数が参照型または Null 型の場合

注記:お尋ねになるかもしれませんが、typeof 演算子が null 値に対して "Object" と返す理由は何でしょうか。これは実際には JavaScript の最初の実装におけるエラーであり、ECMAScript が引き継いだものです。現在では null はオブジェクトの占位符と考えられており、この矛盾を説明していますが、技術的にはそれでもまだ原始値です。

Undefined 型

前述の通り、Undefined 型は値が 1 つしかありません。宣言された変数が初期化されていない場合、その変数のデフォルト値は undefined です。

var oTemp;

前の行のコードでは変数oTempが宣言されており、初期値がありません。この変数はundefinedの値、つまりundefinedのリテラルに割り当てられます。この変数の値がundefinedであるかどうかをテストする以下のコードを使用できます:

var oTemp;
alert(oTemp == undefined);

このコードは「true」を表示し、これら2つの値が実際に等しいことを示しています。この変数の値がundefinedであることをtypeof演算子で表示することもできます:

var oTemp;
alert(typeof oTemp); //出力「undefined」

ヒント:値undefinedは未定義の値とは異なりますが、typeof演算子は本当にこれら2つの値を区別しません。以下のコードを考えてみましょう:

var oTemp;
alert(typeof oTemp);  //出力「undefined」
alert(typeof oTemp2);  //出力「undefined」

前のコードでは、2つの変数に「undefined」を出力していますが、oTemp2のみが宣言されていません。oTemp2に対してtypeof以外の演算子を使用するとエラーが発生します。なぜなら、その他の演算子は宣言された変数に対してのみ使用できるからです。

たとえば、以下のコードはエラーを引き起こします:

var oTemp;
alert(oTemp2 == undefined);

関数が明確な返値を持たない場合、その返値も「undefined」の値です。以下のように示されます:

function testFunc() {
}
alert(testFunc() == undefined);  //出力「true」

Null型

他に1つの値を持つ型としてNullがあります。この型にはnullという1つの専用の値があり、それがリテラルです。値undefinedは実際にはnullから派生したものであり、ECMAScriptではそれらを等しいと定義しています。

alert(null == undefined);  //出力「true」

この2つの値は等しいですが、意味が異なります。undefinedは変数が宣言されていても初期化されていない場合にその変数に割り当てられる値であり、nullはまだ存在していないオブジェクトを表します(typeof演算子について話すときに簡単に紹介しました)。関数やメソッドがオブジェクトを返す場合、そのオブジェクトが見つからないときに通常nullが返されます。

Boolean型

Boolean型はECMAScriptで最もよく使われる型の1つです。この型にはtrueとfalseの2つの値があります(つまり2つのBooleanリテラルです)。

falseは0に等しくない場合でも、必要に応じて0がfalseに変換されるため、Boolean文で両方を使用するのは安全です。

var bFound = true;
var bLost = false;

Number型

ECMA-262で定義された最も特別な型はNumber型です。この型は32ビットの整数を表すだけでなく、64ビットの浮動小数点数も表すことができます。

直接入力された(他の変数からアクセスされていない)数字は、Number型のリテラルとして見なされます。以下のコードは、リテラル86で定義された整数值を保持する変数を宣言しています:

var iNum = 86;

8進数と16進数

整数はまた、8進数(底が8)や16進数(底が16)のリテラルで表現できます。8進数のリテラルの最初の数字は0で、その後の数字は任意の8進数の数字(0から7)が続きます。以下のコードが示しています:

var iNum = 070;  //070は十進数の56に等しい

十六進数のリテラルを作成するには、最初の数字は0で、その後xと続いて任意の十六進数(0から9およびAからF)が続きます。これらの文字は大文字でも小文字でもかまいません。例えば:

var iNum = 0x1f;  //0x1fは十進数の31に等しい
var iNum = 0xAB;  //0xABは十進数の171に等しい

ヒント:すべての整数は八進数や十六進数のリテラルで表現できますが、すべての数学演算が十進数の結果を返します。

浮動小数点数

浮動小数点値を定義するには、小数点と小数点の後ろに1桁の数字を含めなければなりません(例えば、1.0を使用して1を使用するのではなく)。これが浮動小数点リテラルと見なされます。例えば:

var fNum = 5.0;

浮動小数点リテラルの面白い点は、計算を行う前に実際に保存されているのは文字列であることです。

科学記数法

非常に大きい数や非常に小な数は、科学記数法で浮動小数点数を表現できます。数は数字(十進数の数字を含む)にe(またはE)をつけて、その後10の倍数を乗じたものとして表現できます。例えば:

var fNum = 5.618e7

この記号は数56180000を表します。科学記数法を計算式に変換すると、この値が得られます:5.618 x 107

非常に小な数も科学記数法で表現できます。例えば、0.00000000000000008は8-eで表現できます。17(ここでは、10 が -17 次根に上げられています、これは 10 を 17 回除くことを意味します)。ECMAScript は、6 つ以上の前導 0 を持つ浮動小数点数を科学記数法に変換するデフォルトの設定を持っています。

ヒント:また、64ビット IEEE 754 フォーマットで浮動小数点値を格納することもできます、これは十進値が最大で 17 つの十進位を持つことを意味します。17 位以降の値は切り捨てられ、それにより小さな数学的誤差が生じます。

特別な Number 値

いくつかの特別な値が Number 型として定義されています。最初の二つは Number.MAX_VALUE と Number.MIN_VALUE で、Number 値の集合の外縁を定義しています。すべての ECMAScript 数はこの二つの値の間にあります。ただし、計算で生成された数値の結果はこの二つの値の間に落ちない場合もあります。

計算で生成された数が Number.MAX_VALUE を超えた場合、それが Number.POSITIVE_INFINITY という値に割り当てられます、これは数字の値がもはや存在しないことを意味します。同様に、生成された数が Number.MIN_VALUE を下回る計算も Number.NEGATIVE_INFINITY という値に割り当てられます、これは数字の値がもはや存在しないことを意味します。計算が無限大の値を返した場合、生成された結果は他の計算に使用できなくなります。

実際には、無限大を表す特別な値があります(予想どおりです)、それが Infinity です。Number.POSITIVE_INFINITY の値は Infinity です。Number.NEGATIVE_INFINITY の値は -Infinity です。

無限大の数は正数でも負数でもあり得ますので、数が有穷であるかどうかを判断する方法が一つあります(無限数をそれぞれ単独でテストするのではなく)。isFinite() メソッドをどんな数にも呼び出すことができますが、その数が無限大でないことを確認するために使用します。例えば:

var iResult = iNum * some_really_large_number;
if (isFinite(iResult)) {
    alert("finite");
}
else {
    alert("infinite");
}

最後の特別な値は NaN、数でないことを意味します(Not a Number)。NaN は奇妙な特別な値です。一般的には、このような状況は(String、Boolean など)型の変換が失敗したときに発生します。例えば、単語 blue を数値に変換すると失敗します、なぜならその値に等しい数が存在しないからです。無限大と同様に、NaN は算術計算に使用できません。NaN のもう一つの奇妙な点は、自分自身とは異なることです、これは以下のコードが false を返すことを意味します:

alert(NaN == NaN);  //「false」を出力

この理由から、NaN値自体を使用することは推奨されません。isNaN()関数は非常に良い仕事をします:

alert(isNaN("blue"));  //「true」を出力
alert(isNaN("666"));  //「false」を出力

String 型

String 型のユニークな点は、固定のサイズを持たない唯一の原始型であることです。0 またはそれ以上の Unicode 文字をストレージに格納することができます(Unicodeは国際的な文字セットであり、このトレーニングでは後で説明します)。

文字列の中の各文字は特定の場所を持っており、最初の文字は位置 0 から始まり、2番目の文字は位置 1、それに従って続きます。これは、文字列の最後の文字の場所が文字列の長さから 1 済ることを意味します:

文字の長さと文字の位置

文字列文字列はダブルクォート(")またはシングルクォート(')で宣言されます。Javaではダブルクォートで文字列、シングルクォートで文字を宣言しますが、ECMAScriptには文字型がありませんので、どちらの表示法を使用してもかまいません。例えば、以下の2行のコードはどちらも有効です:

var sColor1 = "red";
var sColor2 = 'red';

String 型にはいくつかの文字列文字列が含まれており、Java、C、Perl の開発者はこれらに非常に慣れ親しんでいるでしょう。

以下に ECMAScript の文字列文字列を挙げます:

文字列 意味
\n ラインフィード
\t タブ
\b スペース
\r カーソルリターン
\f フォームフィード
\\\ バックスラッシュ
\' シングルクォート
\" ダブルクォート
\0nnn 8進マシン語 nnn 表す文字(n 0 から 7までの1つの8進数の1つ()
\xnn 16進マシン語 nn 表す文字(n 0 から F までの16進数の1つ()
\unnnn 16進マシン語 nnnn 表す Unicode 文字(n 0 から F までの16進数の1つ()