サイトトップ

Director Flash 書籍 業務内容 プロフィール

Scripting with CreateJS Suite

Chapter 01 CreateJSを始める前に

□01-02 JavaScriptの基本

本書はJavaScriptの基礎はすでに学ばれた方を対象として、CreateJS Suiteを使ったスクリプティングについて解説します。本節はそのJavaScriptの基礎を確かめ、おさらいすることが目的です。具体的には、変数宣言と関数定義、オブジェクトの参照などについて簡単に解説します。これらの内容はすでにおわかりであれば、本節は流し読みするか、つぎの節に進んでいただいて構いません。


○01-02-01 script要素にJavaScriptを書く

JavaScriptはscript要素に定めます。そして、head要素またはbody要素に含めることができます。script要素のJavaScriptそのものは、ブラウザのウィンドウには表示されません。つぎのようにscript要素を用いれば、HTMLドキュメントの中に直接JavaScriptが書けます。

<script>
// ここにJavaScriptを書く
</script>

Tips 01-02-001■外部JavaScriptファイルを読込む

script要素にsrc属性を定めれば、外部JavaScript(JS)ファイルを読込むこともできます。ライブラリのように行数が多く、使い回しするJavaScriptは、外部ファイルにすると扱いやすくなります。CreateJSのライブラリもこのかたちで使います。

<script src="ファイルのURL">

試しに、body要素にJavaScriptを書いてみます。document.write()メソッドは、括弧()の中に「引数」(ひきすう)として記述した(「渡した」と表現します)値を、HTMLドキュメントに書き加えます。なお、引数にテキストを渡すときは、ダブルクォーテーション(")またはシングルクォーテーションで(')括ります。

つぎのコード001は、JavaScriptのdocument.write()メソッドにより、HTMLドキュメントに「このテキストが表示される」というテキスト(文字列)を書き加えます(図01-02-001)。script要素はbody要素に含めました(コード01-02-001第9〜11行目)。

コード01-02-001■HTMLドキュメントにdocument.write()メソッドでテキストを書き加える
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Sample</title>
  6. </head>
  7. <body>
  8. <h2>ドキュメントにテキストを加える</h2>
  9. <script>
  10. document.write("このテキストが表示される");
  11. </script>
  12. </body>
  13. </html>

図01-02-001■HTMLドキュメントにJavaScriptでテキストが加えられた

document.write()メソッドの引数に渡した文字列がHTMLドキュメントに加わる。

Word 01-02-001■関数とメソッド

関数」は、狭い意味では、指定された値をもとに予め決められた処理を行い、その結果を示すプログラミング上の命令のことを指します。Microsoft Excelの関数は、その典型です。そして、クラスまたはオブジェクトに定義された関数を「メソッド」と呼びます。

関数(メソッド)をスクリプトから実行することは、「呼出す」と表現することもあります。関数の括弧()内に値を指定することは「渡す」といい、渡される値を「引数」(ひきすう)あるいは「パラメータ」と呼びます。関数が処理結果の値を示すことは「返す」と表現し、返される値は「戻り値」と称されます。

広い意味では、引数をとらない関数もあり、関数がつねに値を返すともかぎりません。つまり、予め定められた一連の処理を行う命令が、関数だといえます。JavaScriptは、この意味の関数(メソッド)とプロパティで構成されています。


[*筆者用参考]
HTML5.JP「script要素
HTML5タグリファレンス「<script>


○01-02-02 変数を使う

document.write()メソッドは、スクリプトの処理結果が正しいかどうかを確かめる(「デバッグ」といいます)ときにも用いられます。同じように使われるメソッドにalert()があります。警告のダイアログボックスを開いて、引数の値を表示します。ダイアログボックスを閉じないと、次の処理に進んだり、ブラウザを操作できないことにご注意ください。

前掲コード01-02-001第10行目の後につぎのようなalert()メソッドのステートメント(命令文)を加えると、ブラウザのウィンドウから警告ダイアログが開いて、HTMLドキュメントと同じく「このテキストが表示される」と示されます(図01-02-001)。なお、ダブルスラッシュ(//)はコメントを意味し、その後行末まではスクリプトには含まれない注釈・メモとみなされます。

  1. document.write("このテキストが表示される");
    alert("このテキストが表示される");   // 追加
図01-02-002■alert()メソッドが警告ダイアログボックスにテキストを表示する

alert()メソッドの引数に渡した文字列が警告ダイアログボックスに示される。

Tips 01-02-002■document.write()メソッド

W3CはHTML5でdocument.write()メソッドを使うことは避けた方がよいとしています(HTML5「3.5.3 document.write()」<http://www.w3.org/TR/html5/apis-in-html-documents.html#document.write>参照)。本書では、このメソッドを用いるのはデバッグに止め、最終的なコンテンツには使いません。

[*筆者用参考]
3streamer blog「HTML5でdocument.writeは使ってはいけない?

ここで、document.write()alert()メソッドに同じ文字列(「このテキストが表示される」)を引数として渡していることが気になります。このままでは、値に修正が加わるたびに2箇所直さなければなりません。このようなときは、共通に使う値を変数に入れます。

変数はキーワードvarで宣言し、名前を半角英数字で定めます。もう少し細かく説明すると、変数名の先頭には数字が使えず、記号は「_」(アンダースコア)と「$」(ドル記号)のみ用いることができます。このような命名規則にしたがった名前を「識別子」と呼びます。

varキーワードで変数を宣言すれば、その後いつでも代入演算子=で値を納めることができます。変数に値を入れることは「代入」といいます。また、変数をvar宣言するときに、値も代入して構いません。

var 変数名;

var 変数名 = 値;

Word 01-02-002■識別子

プログラムで扱う変数や関数などにつける名前です。つぎの4つの決まりがあります。

  1. すべて半角で、英数字か「_」(アンダースコア)または「$」(ドル記号)のみを用います。ただし、「$」はあまり使われません。
  2. 識別子の最初の文字に、数字を使うことはできません。
  3. 英字の大文字小文字は区別されます。
  4. JavaScriptの構文に含まれているような特別な意味のあるキーワード(「予約語」)を用いることはできません。

Tips 01-02-003■識別子にUnicode文字が使える

JavaScriptの最近の仕様(ECMAScript v3標準)では、識別子に半角英数字だけでなくUnicode文字が使えます。つまり、変数名を全角の日本語(2バイト文字)でつけることもできるのです。ただ、あえて識別子に日本語を用いる利点はあまり考えられません。また、識別子以外のスクリプトを全角入力のまま気づかずに書けば、動かないということにもなります。特別の必要がないかぎり、やはり半角英数字を用いるのがよいでしょう。

[*筆者用参考]
(DxD)∞「JavaScript 第5版 - 2章 字句構造

つぎのコード01-02-002は、varを宣言した変数(myText)に、文字列(「このテキストが表示される」)を代入しています(第10行目)。そして、その変数をdocument.write()alert()メソッドに、それぞれ引数として渡しました(第11〜12行目)。これでもしテキストを変えたくなったら、変数に納める文字列を1箇所書替えるだけで、ドキュメントと警告ダイアログボックスの両方に反映されます。

コード01-02-002■変数の文字列をHTMLドキュメントと警告ダイアログボックスに表示する
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Sample</title>
  6. </head>
  7. <body>
  8. <h2>ドキュメントにテキストを加える</h2>
  9. <script>
  10. var myText = "このテキストが表示される";
  11. document.write(myText);
  12. alert(myText);
  13. </script>
  14. </body>
  15. </html>

○01-02-03 ボタンクリックでランダムな数字を出す

alert()メソッドをボタンのクリックで呼出し、警告ダイアログボックスにランダムな数値を表示してみましょう。まず、ボタンはbutton要素で表示します。フォームと絡めない単純なボタンは、type属性を"button"に定めます。そして、クリックしたとき実行したいJavaScriptのステートメントは、onclick属性に文字列で書き加えます(後述Word 01-02-003「イベントハンドラ」参照)。

<button type="button" onclick="JavaScriptのステートメント">ボタンのラベル</button>

つぎに、ランダムな数値はMath.random()関数で得られます。関数の戻り値は、0以上1未満の小数値です。以下のコード01-02-003は、Math.random()関数で求めたランダムな数値を変数(randomNumber)に納めています(第11行目)。そのうえで、ボタンをクリックしたとき、警告ダイアログボックスにその数値を表示します(第9行目)。

コード01-02-003■変数の文字列をHTMLドキュメントと警告ダイアログボックスに表示する
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Sample</title>
  6. </head>
  7. <body>
  8. <h2>ランダムな数字を出す</h2>
  9. <button type="button" onclick="alert(randomNumber);">ランダム数</button>
  10. <script>
  11. var randomNumber = Math.random();
  12. </script>
  13. </body>
  14. </html>

ただ、ボタンをクリックしたとき示されるランダムな小数値は、何度クリックしても同じ値です(図01-02-003)。それは、script要素に書かれたランダムな数値の変数(randomNumber)への代入が、body要素を読込んだとき1度行われたきりで(コード01-02-003第10〜12行目)、ボタンを押しても更新されないからです。

図01-02-003■alert()メソッドで警告ダイアログボックスにランダムな数値を表示する

ボタンを何度押しても、表示される小数値は変わらない。

Word 01-02-003■イベントハンドラ

ブラウザの中で起こるプログラム上意味のあるできごとを「イベント」といいます。クリックなどのマウス操作やキー入力といったユーザーインタラクションのほか、HTMLドキュメントやその中の要素が読込まれるといったこともイベントに含まれます。

そして、イベントが起こったとき実行するよう定められた処理を「イベントハンドラ」と呼びます。すると、button要素のonclick属性は、ボタンクリックというイベントにイベントハンドラを設定する役目だといえます。


[*筆者用参考]
HTML5.JP「button要素
HTML5タグリファレンス「<button>
JavaScript入門「クリック時の処理(onClick)」
ITpro「イベントハンドラから脱却しよう


○01-02-04 関数を定義して呼出す

ボタンを押すたびに違うランダム数を出すには、Math.random()関数を呼出して変数に納めるステートメントも、onclick属性に定める処理として加えなければなりません。複数のステートメントをまとめて、何度も実行したいときには、関数として定めるのがよいでしょう。

関数はfunctionキーワードで定めます。関数名にはもちろん識別子(Word 01-02-002)を用います。続く丸括弧()の中には、必要があれば引数が加えられます。引数が複数あるときには、カンマ(,)で区切ります。そして、波括弧{}の中に関数本体となるステートメントを何行でも書き加えます。

function 関数名() {
  // ステートメント
}

ひとたび関数を定義すれば、いつでも関数名に演算子()を添えて呼出せます。引数を渡す場合には、()演算子の中に書き加えます。

関数名()

前掲コード01-02-003を書直して、ボタンクリックのたびに表示されるランダムな数値が変わるようにするには、たとえばつぎのような関数(showRandomNumber())を定めます。

<script>
function showRandomNumber() {
  var randomNumber = Math.random();
  alert(randomNumber);
}
</script>

そして、button要素のonclick属性には、その関数呼出しをつぎのように加えればよいです。これで、ボタンをクリックするたびに新たなランダム数が変数(randomNumber)に入りますので、表示される小数値は毎回変わります。

<button type="button" onClick="showRandomNumber()">ランダム数</button>

ただ、この機会にもう少し手を入れましょう。ランダムな数は、小数値でなく、サイコロの目と同じ1から6までの整数にします。その場合の式の立て方は、つぎの表01-02-001のように4つの段階に分けて考えます。

表01-02-001■1から6までのランダムな整数値を得る式の考え方
Step 考える点 得られる数値
1 関数そのまま Math.random() 0以上1未満の小数値
2 必要な目の数は6 Math.random() * 6 0以上6未満の小数値
3 小数点以下は切捨て Math.floor(Math.random() * 6) 0、1、2、3、4、5
4 1を足す Math.floor(Math.random() * 6) + 1 1、2、3、4、5、6

第1に、Math.random()関数そのままでは、0以上1未満の小数値が返されます。そこで第2に、必要な値の幅、つまりほしい目の数6を掛け算します。すると、小数値は0以上6未満になります。第3に、値を整数値にします。そのためには、戻り値の小数点以下を切捨てます。切捨てに用いるのはMath.floor()関数です。これで、0から5までの6つの整数のいずれかが得られます。最後に1を加えれば、1から6までのサイコロの目がランダムに求められるのです。

一般にはつぎの式で、最小値から最大値までのランダムな整数が得られます。

Math.floor(Math.random() * ( 最大値 - 最小値 + 1)) + 最小値

Tips 01-02-004■Math.floor()関数による負数の切捨て

Math.floor()関数は、引数値を超えないもっとも大きい整数を返します。負の数を切捨てるときには、お気をつけください。たとえば、Math.floor(-1.1)は-1ではなく、-2を返します。戻り値の整数は、引数に渡した-1.1より大きくてはいけないからです。

関数を定義したり、スクリプトのステートメント数も増えてくると、JavaScriptはbody要素よりhead要素に書いた方が扱いやすくなってきます。そこで、つぎのコード01-02-004は、関数(showRandomNumber())を定義するscript要素はhead要素に含めました(第6〜11行目)。これで、ボタンをクリックするたびに、サイコロの目と同じ1から6までのランダムな整数が警告ダイアログボックスに示されます(図01-02-004)。

コード01-02-004■ボタンをクリックすると1から6までのランダムな整数を警告ダイアログに表示する
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Sample</title>
  6. <script>
  7. function showRandomNumber() {
  8.   var randomNumber = Math.floor(Math.random() * 6) + 1;
  9.   alert(randomNumber);
  10. }
  11. </script>
  12. </head>
  13. <body>
  14. <h2>ランダムな数字を出す</h2>
  15. <button type="button" onClick="showRandomNumber()">ランダム数</button>
  16. </body>
  17. </html>

図01-02-004■ボタンを押すと警告ダイアログボックスに1から6までのランダムな整数が表示される

示される整数は、サイコロを振るように、ボタンを押すたびに変わる。

○01-02-05 ローカル変数とは

前掲コード01-02-004でランダムな数を代入した変数(randomNumber)は、つぎのように関数(showRandomNumber())の外で宣言しても同じように動きます。けれど、スクリプトとしての意味は変わります。

    var randomNumber;
  1. function showRandomNumber() {
  2.   // var randomNumber = Math.floor(Math.random() * 6) + 1;
      randomNumber = Math.floor(Math.random() * 6) + 1;   // 書替え
  3.   alert(randomNumber);
  4. }

変数は代入した値をメモリするのが役目です。var宣言を関数本体の中に置くか、関数の外に書くかによって、実はメモリされる場所が違うのです。

関数の外で宣言された変数は、ブラウザウィンドウの中身すべてを司るオブジェクトである「グローバルオブジェクト」に保持されます。「中身すべて」ということは、定義した関数そのものも、グローバルオブジェクトにメモリされるということです。

それに対して、関数を呼出すと、それを実行する間だけつくられるオブジェクトがあります。関数内でvar宣言した変数は、そのオブジェクトにメモリされます。このオブジェクトは、関数の処理が済めば原則として消し去られ、関数の外からはアクセス(「参照」)できません。関数の中でvar宣言された変数は、「ローカル変数」と呼ばれます。

メモリ場所が違うということは、関数の中と外に同じ名前でvar宣言した変数に異なる値を入れても、それぞれが別に保持されることになります。ただし、関数内から変数を参照したときは、ローカル変数の値が優先して取出されます。他方で、関数が定められたオブジェクトは、キーワードthisで参照できます。すると、ローカル変数と同名でグローバルオブジェクトに宣言された変数は、thisキーワードとドット(.)に続けて変数名を書けば参照できます。

前掲コード01-02-004の関数(showRandomNumber())につぎのような2行のステートメントを加えると、alert()メソッドがふたつに増えたので、警告ダイアログボックスは2回開きます。最初のダイアログボックスに示されるのは、もとのコード01-02-004と同じ1から6までのランダムな整数です。追加したalert()メソッドの引数には変数(randomNumber)にthisキーワードを添えましたので、ふたつ目のダイアログボックスにはグローバルオブジェクトにvar宣言した変数の値(10)が表れます。なお、グローバルオブジェクトに宣言した変数を「グローバル変数」と呼ぶことがあります。

    var randomNumber = 10;   // 追加
  1. function showRandomNumber() {
  2.   var randomNumber = Math.floor(Math.random() * 6) + 1;
  3.   alert(randomNumber);
      alert(this.randomNumber);   // 追加
  4. }

図01-02-005■ふたつ目に開く警告ダイアログボックスにはグローバル変数値が示される

ふたつ目のalert()メソッドの引数には変数にthisキーワードを添えたので、グローバルオブジェクトにvar宣言した変数が参照される。

○01-02-06 WindowオブジェクトとCallオブジェクト

ブラウザウィンドウを開くと、JavaScriptのプログラムを実行するのに先立って、グローバルオブジェクトがつくられます。ブラウザウィンドウにおけるグローバルオブジェクトは、Windowオブジェクトです。

たとえば、前掲コード01-02-002で用いたdocument.write()メソッドの頭のdocumentというのは、Windowオブジェクトのプロパティです。write()はDocumentオブジェクトのメソッドなので、documentプロパティから参照を得て、そのオブジェクトに対してwrite()メソッドを呼出したのです。前掲コード01-02-002のdocument.write()メソッドの呼出し(第10行目)は、つぎのように書替えても同じように動きます。

  1. // document.write(myText);
    var myObject = this.document;
    myObject.write(myText);

さらに、alert()はWindowオブジェクトのメソッドです。また、Windowオブジェクトにはwindowプロパティが備わっていて、Windowオブジェクト自身を参照します。すると、前掲コード01-02-004のalert()メソッドの呼出し(第9行目)は、つぎのように書替えても動きは変わりません。

  1. // alert(randomNumber);
    window.alert(randomNumber);

もっとも、参照先を省いてプロパティやメソッドを用いると、これまで見たように多くの場合Windowオブジェクトがデフォルトで参照されます。つぎに説明するローカル変数も含めて何が参照されるのか理解してさえいれば、省ける記述は省いて差支えありません。

Tips 01-02-005■プロパティやメソッドの表記にオブジェクトを添える

JavaScriptの解説やリファレンスでは、プロパティやメソッドを示すとき、そのプロパティやメソッドの備わるオブジェクトを頭に添えることがあります。たとえば、Window.documentプロパティとかWindow.windowプロパティ、あるいはDocument.write()メソッドやWindow.alert()メソッドという書き方です。けれど、スクリプトにはこのまま記述するのではなく、それぞれのオブジェクトの参照は何らかのかたちで得たうえでプロパティやメソッドを用いるという意味になります。

前項01-02-05「ローカル変数とは」に述べたとおり、ローカル変数は関数を「実行する間だけつくられるオブジェクト」に保持されます。これをCallオブジェクトといいます。ローカル変数のほか、関数に渡された引数も、このCallオブジェクトに納められます。

そして、関数の処理が終われば、CallオブジェクトはJavaScriptのメモリ管理の仕組み(「ガベージコレクション」という技術)により、原則として消し去られます。したがって、Callオブジェクトは、関数が呼出されるたびに新たにつくられるのです。ローカル変数の値もその都度改められ、メモリに残りません。

また、Callオブジェクトには、関数の外からはアクセスできない仕様とされています。つまり、異なる関数の中に同じ名前のローカル変数が宣言されていても、互いにまったく関わり合いをもちません。関数内のローカル変数の値が、他の関数の同名の変数により変えられたり、逆に他の関数のローカル変数を書替えることはないのです。

変数名の重複を気にしなくて済み、メモリも無駄に費やさないことがローカル変数の利点です。逆に、複数の関数から参照したり、関数の処理を終えてもメモリに残す必要がある値は、グローバル変数やグローバルオブジェクトの中にあるオブジェクトに納めます。

[*筆者用参考]
『JavaScritp第5版』p.56〜


○01-02-07 配列とオブジェクトの参照

ひとつの変数には、ひとつの値しか入れられません。ただし、値は数値や文字列にかぎらず、オブジェクトも納められます。中でもArrayオブジェクトには値がいくつでも加えられるので、値をまとめて扱うことができます。Arrayオブジェクトは「配列」とも呼ばれます。

オブジェクトをつくるには、オブジェクトと同じ名前のコンストラクタという関数をnew演算子に添えて呼出すのが原則です。たとえば、配列のオブジェクトはつぎのようにしてつくります。

var my_array = new Array();

new演算子でArray()コンストラクタ関数を呼出し、つくられた配列(Array)のオブジェクトが変数(my_array)に納められました。このとき変数に入ったオブジェクトも、Arrayオブジェクトと呼ぶことができます。けれど、Arrayオブジェクト(のコンストラクタ)からArrayオブジェクトができた、というのは紛らわしいです。つくられたオブジェクトは「インスタンス」とも呼ばれますので、場合によってこの語を用います。

配列には、Array.push()メソッドで値が加えられます。配列に納められる値には、0から始まる通し番号の整数がインデックスとして与えられます。配列の中のひとつひとつの値は、エレメント(要素)と呼ばれます。なお、配列エレメントには、数値や文字列にかぎらず、オブジェクトも納められます。

つぎのコードは、新たにつくった配列(my_array)にArray.push()メソッドで3つのエレメントを加え、Window.alert()メソッドで配列の中身を表示します。警告ダイアログボックスには、すべての配列エレメントがカンマ(,)区切りで示されます(図01-02-006)。

var my_array = new Array();
my_array.push(100);
my_array.push(200);
my_array.push(300);
alert(my_array);   // 表示: 100,200,300
図01-02-006■警告ダイアログボックスに配列の中身が表示される

Window.alert()メソッドの引数に配列を渡すと、すべてのエレメントがカンマ区切りで示される。

配列エレメントには、角括弧(ブラケット)[]演算子の中にインデックスを書き加えてアクセスします。エレメントの値は、取出すだけでなく、書替えられます。たとえば、前掲の配列(my_array)のエレメントは、つぎのように取得・変更することができます。警告ダイアログボックスの表示内容は、コードにコメントとして書添えました。

var element1 = my_array[1];
alert(element1);   // 表示: 200
my_array[2] = element1;
alert(my_array);   // 表示: 100,200,200

Arrayオブジェクトは、他の多くのオブジェクトとは違い、コンストラクタを使わずにインスタンスがつくれます。角括弧[]演算子を空のまま書けば、それで新たな配列インスタンスができあがります。また、角括弧[]演算子で任意のインデックスにエレメントが加えられますので、Array.push()メソッドは必ずしも使わずに済みます。

var my_array = [];
my_array[0] = 100;
my_array[1] = 200;
my_array[2] = 300;
alert(my_array);   // 表示: 100,200,300

さらに、[]演算子を空にせず、カンマ区切りで直に値を書き加えれば、エレメントの入った配列がつくれます。このように、Array()コンストラクタを呼出すことなく、[]演算子で書かれた配列を配列リテラルと呼ぶことがあります。

var my_array = [100, 200, 300];
alert(my_array);   // 表示: 100,200,300

Word 01-02-004■リテラル

「リテラル」とは、プロパティや変数から値を取出したり関数(メソッド)の戻り値を受取るのではなく、プログラムのコードにそのまま直に書込まれた値を示します。文字列や数値はリテラルで書かれます。たとえば、つぎの代入式の右辺値は、いずれもリテラルです。

var myText = "このテキストが表示される";
var randomNumber = 10;
var my_array = [100, 200, 300];

配列の応用練習としてDateオブジェクトも使って、現在の曜日を漢字で表してみましょう。Dateオブジェクトはお約束どおり、コンストラクタ関数を呼出してつくります。Dateインスタンスは日時についての情報をもち、それらの値はメソッドで取出します。そして、曜日はDate.getDay()メソッドで調べられます。戻り値は日曜日が0、土曜日を6とする連番の整数です。

以下のコード01-02-005は、今現在の日時情報に加えて、漢字の曜日を警告ダイアログボックスに表示します(図01-02-007)。Date()コンストラクタを引数なしで呼出すと、そのときの日時情報をもったインスタンスがつくられます(第1行目)。そのインスタンス(my_date)に対してDate.getDay()メソッドを呼出せば、現在の曜日を示す整数が返されます(第2行目)。そこで、曜日の整数インデックスに合わせて曜日の文字列が並んだ配列リテラルをつくります(第3行目)。あとは、配列から曜日のインデックスにあるエレメントを取出せば、それが今日の曜日です(第4行目)。

コード01-02-005■Dateインスタンスから曜日を調べて漢字で表す
  1. var my_date = new Date();
  2. var nDay = my_date.getDay();
  3. var my_array = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"];
  4. alert([my_date, my_array[nDay]]);

図01-02-007■警告ダイアログボックスにDateインスタンスの日時情報と漢字の曜日が示される

Window.alert()メソッドの引数を配列リテラルで渡せば、ひとつの警告ダイアログボックスに複数の値が表せる。

なお、前掲コード01-02-005ではWindow.alert()メソッドにも、引数として配列リテラルを渡しました(第4行目)。最初のエレメントはDateインスタンス(my_date)、つぎが配列(my_array)から取出した曜日の文字列です。このように配列リテラルを引数に使えば、ひとつの警告ダイアログボックスにカンマ区切りで複数の値を示すことができるのです(前掲図01-02-007)。

配列を含むオブジェクト(「参照型」と呼ばれます)の扱いでは、その参照について知っておかなければなりません。その前に、オブジェクトとは扱いが異なる数値(「基本型」に属します)の場合を確かめておきましょう。ひとつの変数(a)の値を別の変数(b)に代入し、その後初めの変数値を書替えています。結果、ふたつの変数には別々の値が入っています。

var a = 100;
var b = a;
var a = 200;
alert([a, b]);   // 表示: 200,100

つぎは、参照型のデータである配列の場合です。変数(a)に配列リテラルでインスタンスをつくり、そのインスタンスを別の変数(b)に代入します。その後、初めの配列にエレメントを加えました。すると、もうひとつの変数の配列もエレメントが増えて、同じ中身になっています。

var a = [100];
var b = a;
a[1] = 200;
alert(a); // 表示: 100,200
alert(b); // 表示: 100,200

なぜなら、参照型である配列のインスタンスは、変数に直接納められるのではないからです。オブジェクトは変数とは別の場所につくられます。そして、変数にはオブジェクトのありかが保持されるのです。別の変数に代入したときも、同じオブジェクトの場所が渡されるだけです。オブジェクトのありかを「参照」と呼びます。つまり、ひとつの変数が参照するオブジェクトに手を加えれば、同じ参照をもつすべての変数についてもオブジェクトが書替わることになるのです。

これは銀行口座の取引と似ているかもしれません。口座を開くというのは、その銀行の本店コンピュータに取引のデータをつくることです。すると、通帳やキャッシュカードとともに口座番号が与えられます。キャッシュカードはどの支店でもATMでも使え、口座番号にもとづいて現金が出し入れされ、口座の出納記録は書替えられます。支店やATMがいくつあっても、ひとつの口座番号が「参照」する口座データはひとつなのです。

[*筆者用参考]
『JavaScritp第5版』p.42〜/p.53〜



作成者: 野中文雄
更新日: 2012年12月23日 コードのhead要素の記述を統一し、それにともない行番号の参照を修正。また、サンプルファイルのリンクを追加。
作成日: 2012年7月9日


Copyright © 2001-2012 Fumio Nonaka.  All rights reserved.