JavaScript 型の解説

出典: フリー教科書『ウィキブックス(Wikibooks)』

メインページ > 工学 > 工学情報 > プログラミング > JavaScript > JavaScript 型の解説

目次

[編集] 型の復習

まずは、先程まで解説を控えていた型のさらに詳しい解説を行う

[編集] 偽の特別な変数

プログラムの歴史での多くの経験から、JavaScrriptでは、偽を表すための多くのデータ型が存在する。 Undefined型や、Null型等がそれにあたる。

[編集] Undefined型

"何のデータも代入されていない状態"を指す。 つまりは、宣言されたときは

var foo;
document.write( foo );  //"undefined"が表示される 

となる。これはオブジェクトに何も代入されていない場合全般に渡って出会う事になる。

具体的な例としては

var foo = 1500;
document.write( foo.length );  // 数字型には、lengthはありません 

等、定義されていないメソッドやプロパティを呼び出すときに出会う。 他にもDOMを使用して、HTMLデータを操作する際にも、存在しないデータを探すため出会う事がある。 (XMLデータの操作に関しては後述する)

[編集] Null型

元はドイツ語の「0」を表す言葉でプログラム上では、計算処理に失敗した場合の返り値として使われるのが一般的である。 JavaScriptではundefined型やfalse型は使われることが多いが、他の代表的な言語に比べて使う場面は少ない。

[編集] 数字(Number)型

JavaScriptの数字型は、正負の数値や小数も統一して扱えるが、無限の大きさや小ささの数値を扱えるのではなく、範囲には限りがある。 具体的には、JavaScript標準では64ビット浮動小数点型の数値の限りを扱うことになっており、その大きさは整数なら±2の52乗の範囲を扱える。 (10進数では10の15乗程度)

また、これを超える数も扱えるが(10進法で320桁程度)、小数点以下15桁以上は切り捨てられ、対数表示で表現される。 少数も、性格に表現される桁数はそこまでである。 この程度の桁数があれば、物理演算でも実用上困ることは少ないが、少数を扱う場合には注意すべき点が幾つかある。

例を一つ挙げるが、次のコードは無限ループとなる。 これは10進法での"10/3"が"3.3333...." と循環無限小数となる様に2進法では"0.1"が割り切れずに循環無限小数となる事から誤差が出るため、脱出条件を満たさなくなるためである。

var foo=1;
while( 0 != foo )
  foo -= 0.1; 

その他の点に関しては該当項目を参照のこと。

また、数字型は"0x"で始める事により、16進数での表記も可能である。

0xff;	// 16進数で255 

[編集] 数値型の特別な値

数値型には、整数、小数以外にも次のような特別な数値型の値が3つ存在する。

  • +Infinite 正の無限大
  • -Infinite 負の無限大
  • NaN Not-a-Number

それぞれの扱いは次の様になる。

[編集] Not a Number

Not a Numberは、計算できない式に対するエラーを指す。 具体的には

  • 計算結果がNumber型で扱えないほど大きな数字、または小さな数字になった時
  • 数学的に計算できない値が出てきたとき(具体的には"-1の平方根"等)

に良く出会うことになる。

[編集] 無限大の扱い

無限大はJavaScript独特の値であるが、高度な数値計算を求めないWebブラウザ上のプログラミングでは余り使うことの無い値であると思われるが、これ以上無いほど大きい、または小さい数として、if文中の比較文などで幾らかの使い道がある。

ゼロと無限大は、数学上では、大変ややこしく、扱いの難しい概念であるが、JavaScriptの規格上は次の様に扱うことになっている。 (以下のように記号を扱う)

  • ∞ 正の無限大
  • -∞ 負の無限大
  • 数字 有限の数(通常使う数字)
  • NaN Not-a-Number

計算結果は

  • 数字 + ∞ = ∞
  • 数字 - ∞ = -∞
  • ∞ + ∞ = ∞
  • ∞ - ∞ = NaN
  • 0 * ∞ = NaN
  • 数字 * ∞ = ∞
  • ∞ * ∞ = ∞
  • ∞ / 0 = ∞
  • 数字 / ∞ = 0
  • ∞ / ∞ = NaN
  • ∞ % 数字 = NaN
  • 数字 % ∞ = NaN
  • ∞ % ∞ = NaN
[編集] 無限大の計算の実行コード
var add = Infinity + Infinity;
document.write( "足し算 : " + add + "<br />" );
var sub = Infinity - Infinity;
document.write( "引き算 : " + sub + "<br />" );
var mul = Infinity * Infinity;
document.write( "掛け算 : " + mul + "<br />" );
var div = Infinity / Infinity;
document.write( "割り算 : " + div + "<br />" ); 

[編集] 文字列型

[編集] エスケープシーケンス

キーボードからの入力が困難、または文字列への挿入が文法上問題のあるものは「¥記号」を使ったエスケープシーケンスを使って挿入する

  • \n 改行
  • \t タブ
  • \\ 円マーク
  • \' シングルクォーテーション
  • \" ダブルクォテーション
  • \xXX ASCII文字挿入
  • \uXXXX ユニコード文字挿入

HTMLの規格上、改行やタブの記号は、対外の場合で無視されるので、Webブラウザ上での動作を考えると、これらのエスケープを使う事はあまり多くは無いと思われるが、シングルクォテーション、ダブルクォテーション、円記号に関しては時折使用することがある。 ただし、JavaScriptでは文字列の宣言に、シングル、ダブルクォテーションがどちらも使えるので

var foo="Hello,'JavaScript' World!";	// ダブルクォテーションの中にシングルクォテーション
var bar='Hello,"JavaScript" World!';	// シングルクォテーションの中にダブルクォテーショ 

の様にシングル、ダブルクォーテーションを入れ子に使った方がスマートになる。

また、次のエスケープシークエンスも規格上存在する(実装により、動かない場合が多くある)

  • \0 null文字
  • \f 改ページ
  • \r キャリッジリターン(復帰文字)
  • \b バックスペース
  • \v 垂直タブ

これらの文字は"\0"と"\r"を除けば、現在ではほとんど使われていない。

[編集] JavaScript中での文字列の扱い

JavaScriptでは、文字列は内部的にはUTF-16(Unicode)で扱うことに決まっている。 つまりは、アルファベットや数字等の多くの文字コードで1バイト文字として扱われているものも、日本語の文字列等の2バイトのコードも同じ様に扱われる。 (C/C++等多くの言語では、これは得られない恩恵である) また、Unicodeで制定されている範囲で日本語以外の文字も挿入可能である。 (OSによってはフォントインストールする必要があったり、テキストエディタが入力に対応していない場合もあるので注意すること)

Webブラウザに関しては問題ないが、これに従っていない実装もあるのでそのときは注意すること。

[編集] 余談:バックスラッシュと円マーク

英語圏のプログラム解説本よ読むことになる機会がある事があるかもしれないが、このとき普通「\」記号があるはずの場所にバックスラッシュ「\」が入っている場合がある。 これは、日本にコンピュータが入ってきたときに円記号を使うために、バックスラッシュの所の文字コードを円記号に変えてしまったことに由来しており、本質的にこの2つは同じものである。詳しくはWikipediaの該当項目を参照のこと。

[編集] 真偽値型

真偽値型は、true、falseの値を取るが、これらは歴史的経緯から内部で、数字の1と0を取る。 if文中では、数字の0が偽を表わすためである。

[編集] オブジェクト型

詳しい解説は後の項に回すが、Objectと"はデータその物を表す基本的な抽象的な概念"そのものを表すオブジェクトで、JavaScript中ではすべてのオブジェクトはこの型の機能を受け継いでいる。

実用としては、数字や文字列以外の基本的なデータ型を追加したい場合にその下敷きとして使われたりする。 現在の段階では、次で説明するtypeof演算子で型チェックをした場合等に、配列等の一部のデータ型で返ってくるものと記憶しておけば問題ない。

[編集] typeof 演算子

typeof演算子は、変数のデータ型を調べるために使う演算子である。

関数の入り口で、何のデータが入っているかを調べるとき等に使う。

function foo( str ){
  if( 'string' != typeof str )  return null;  // データが文字列以外のときは失敗としてnullを返す
  // 文字列に関する処理;
} 
ヘルプ