☆ 変数の種類 |
|
|
JavaScriptで扱う変数には、Number(数値)、String(文字列)、Boolean(真偽)、Object(オブジェクト)、Date(日付)、Function(関数)、Array(配列)などの種類(型)があります。しかし、C言語などとは異なり宣言時に型を決める訳ではないので、見かけ上はその変数が何型なのかは分かりません。また、ある変数が現在String型であっても、後に数値を代入すればNumber型に変化してしまうので注意が必要です。
// 変数の作成・定義例
var num = 10; // 数値
var str = "10"; // 文字列
var bool = true; // 真偽
var img = new Image(); // オブジェクト(画像)
var dt = new Date("2003/1/15"); // 日付
var fun = new Function("alert(arguments[0])"); // 関数
var ar = new Array("abc", "efg", "hij"); // 配列
// 変数の型変化の例
var cnv = 5; // 数値で定義
cnv = new Image(); // 以降、'cnv'はオブジェクト型になってしまう
var result = cnv + 10; // 当然これはエラーになる!
|
上記のように、数値や文字列は変数の初期化に明示的に 'new' を使う必要はありませんが、日付や配列は 'new' を使って初期化します。
|
|
☆ 「var」って |
|
|
「変数の種類」に出てきた 'var 〜' 、これはなんでしょう?
プログラムをされる方はご存知だと思いますが、変数にはグローバル変数とローカル変数があります。'var' を付けて変数を定義するとローカル変数になります。
ローカル変数の場合、その変数の定義された関数内のみで有効な値をとることができます。逆に、グローバル変数はWebページ内で全体で有効です。ただし、Webページ内の関数でない部分で定義されたローカル変数はグローバル変数扱いになります。
JavaScriptはどこでも変数が定義できて便利(勝手に?)なのですが、そこに落とし穴がある場合があります!
上記の結果はどうなりましたか?書換え前の出力は双方とも '5' なのに対して、書換え後の出力はグローバルの方だけ '10' になったと思います。これは、'local()' 関数内の 'valL' がローカル変数として新たに確保されたためです。
要するに 'var' とは明示的に変数を(再)定義する役割をもっています。意図しない変数の書換えを防ぐためにも、できるだけ 'var' を使用した方が良いと言えるでしょう。
|
'var' の厳密な解釈はブラウザによって若干異なりますが、上記例は主なブラウザで動作確認済みです! |
|
|
☆ オブジェクトに新規プロパティを付加する |
|
|
プロパティとは、オブジェクトが固有に持つ変数のことで、element.name の 'name' などがこれに当たります。
ちなみに、オブジェクトが固有に持つ関数はメソッドと言い、element.focus() の 'focus()' がこれです。
ほとんどのオブジェクトは規定のプロパティを持ち自動的に値が設定されているので、ユーザーはそれを参照/設定することでWebページを操作します。
しかし、プロパティも変数であることに変わりないので新たに定義可能なのです!極端に言えば、フレームなどにもプロパティを追加することだってできちゃいます...
// メニュー専用フレームに選択インデックスを割り当てる(極端な例です)
// ボディ側(ロード時)
top.MENU_FRAME.selectIndex = 4; // 選択インデックスの書換え(定義)
// メニュー側(タイマー)
var nowIndex = -1; // 現在のインデックス
function checkIndex(){ // タイマー関数
if (nowIndex != window.selectIndex){ // インデックスが変わっていれば以下を実行
nowIndex = window.selectIndex;
changeSelect(); // 画像のすり替えなどの処理をする
}
}
|
上記の例はフレームという公的(みんなが使う?)なものに変更を行っているので、他人に迷惑をかけないためにもあくまで例題だと理解してください!
実行すると、ボディ内のリンクでページが変わってもメニューに反映させる事ができます。
|
|
☆ 2次元配列を扱う |
|
|
Array(配列)は複数の要素を持つことのできる型で、添字 [x] を使うことで各要素にアクセスできます。
さらに、各要素にはどんな型の変数でも割り当てる事ができます。
ということは、あるArrayの構成要素にArrayを割り当てることもできるはずです!
// 日本語・英語の曜日データを作成する。
<SCRIPT language="JavaScript">
<!--
var arWeek = new Array(0); // 曜日データを格納する配列変数を定義(空)
arWeek[0] = new Array("日", "月", "火", "水", "木", "金", "土"); // 0番目の要素に日本語配列を割当て
arWeek[1] = new Array("Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat"); // 1番目の要素には英語を...
function changeLanguage(){ // 書換え関数(言語選択変更後)
var sel = document.weekForm.languageCB.selectedIndex; // 選択された言語インデックス
for(var i = 0; i < 7; i++){ // 曜日数でループ
document.weekForm.weekCB.options[i].text = arWeek[sel][i]; // テキスト変更
}
}
//-->
</SCRIPT>
|
上記の例で2次元配列の作り方は分かると思います。また、2次元配列へのアクセスですが添字を重ねる
[x][y] だけでOKです。
もし2次元配列を使わなければ、ループ内で 'sel' の評価による振分けが必要になりますが、上のようにすればどんなに言語数を増やしても1行で処理する事ができます。
さらに、これを応用すればn次元配列も簡単に作成できます。
|
|
☆ 連想配列を扱う |
|
|
Perlなどをやっておられる方はお馴染みかと思いますが、連想配列とは添字に数値
[x] ではなく文字列 ['abc'] を使った配列のことです。...とはいっても配列には変わりないので定義やアクセスの方法は何ら変わりません!
連想配列のメリットはターゲットを絞り込んで配列要素にアクセスできることでしょう。普通の配列では、要素の検索にループを用いなければならず処理速度が安定しません。
ただし、注意しなければならないのは添字に使う文字列に重複がないデータしか扱えません。重複があると意図しないデータの上書が発生するからです。例えば、住所録データを作る際、名前を添字にしたいところですが、実際は電話番号やメールアドレスを使った方が良いということです。
// 住所録を検索する。
<SCRIPT language="JavaScript">
<!--
var arAddr = new Array(0); // 住所データを格納する配列変数を定義
arAddr['0545-64-1234'] = new Array("織田 信長", "おだ のぶなが", "259-8643", "安土桃山城507号室");
arAddr['06-6873-2236'] = new Array("豊臣 秀吉", "きのした とうきちろう", "537-0023", "大阪城黄金の間");
arAddr['013-973-2469'] = new Array("徳川 家康", "とくがわ いえやす", "937-0930", "江戸城大奥桜の間");
function searchAddress(){ // 検索開始
var tel = document.addrForm.telED.value; // 検索用電話番号を取得
if (arAddr[tel]){ // 住所データを発見!
document.addrForm.rubiED.value = arAddr[tel][1]; // ふりがな表示
document.addrForm.nameED.value = arAddr[tel][0]; // 名前表示
document.addrForm.postalED.value = arAddr[tel][2]; // 郵便番号表示
document.addrForm.addrED.value = arAddr[tel][3]; // 住所表示
} else { // 発見できない!
document.forms['addrForm'].elements['rubiED'].value = "";
document.forms['addrForm'].elements['nameED'].value = "";
document.forms['addrForm'].elements['postalED'].value = "";
document.forms['addrForm'].elements['addrED'].value = "";
alert("「 " + tel + " 」の人は登録されていません!"); // エラーメッセージを表示
}
}
//-->
</SCRIPT>
|
ちなみに、エラーの部分のフォームへのアクセス方法が今までと違う書き方になっていることに気付きましたか?
実は、name属性の付いたオブジェクトは連想配列で定義されているのです...
|