JavaScriptの配列 vol.2 -配列の宣言(続)-
JavaScriptの配列 vol.1 -配列の宣言- の続きです。JavaScriptの配列 vol.1 -配列の宣言- ではJavaScriptにおける配列の宣言方法を5パターン記しましたが、今回はJavaScriptの配列宣言に伴う摩訶不思議なことについての備忘録です。
1. 配列要素の型
配列要素間の型が異なっていてもエラーになりません。“型苦しい”言語をメインに使っている方には気持ち悪いかもしれません。
var arr_sample = new Array(3); arr_sample[0] = "AB"; arr_sample[1] = 1234; arr_sample[2] = true;
2. 配列宣言時の要素数
宣言時の要素数はあまり意味がありません。配列コンストラクタの引数を2にしたからといって、その配列の要素数が2であるとは限りません。また、むやみに大きな引数を指定すると、lengthプロパティに支障をきたす原因となります(3. 配列宣言時の要素数とlengthプロパティ 参照)。
var arr_sample = new Array(2);//2つの要素を確保 arr_sample[0] = "abc"; arr_sample[1] = "def"; arr_sample[2] = "ghi"; //エラーにならない arr_sample[3] = "jkl"; //エラーにならない /** *「JavaScriptのオブジェクトは動的にプロパティを追加できる」という性質のためエラーにならないのだと思います。 */
3. 配列宣言時の要素数とlengthプロパティ etc.
「lengthプロパティは配列の要素数を正確に返す」と思っていると痛い目に合います。宣言時の確保数(Arrayコンストラクタの引数)を多くしたり、lengthプロパティをいじったり、などといったことをすると、実際の配列要素数とは全く異なる数が返されます。以下のサンプルソースで確認して下さい。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift-jis"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>JavaScriptの配列</title> </head> <body> <script type="text/javascript"> <!-- //配列の要素数,キーと値を表示する関数 function ShowArrayInfo(array){ document.write("配列要素数:"+array.length+"<br>"); for(i in array){ document.write("キー:"+i+" 値:"+array[i]+"<br>"); } } //(1) var arr_sample_1 = new Array(5); arr_sample_1[0] = "abc"; arr_sample_1[1] = "def"; document.write("<p>(1)確保数と実際の要素数が異なるとき<br>"); ShowArrayInfo(arr_sample_1); document.write("</p>"); //(2) var arr_sample_2 = new Array(); arr_sample_2[0] = "abc"; arr_sample_2[1] = "def"; arr_sample_2[2] = "ghi"; arr_sample_2[5] = "jkl"; //[3],[4]をとばしてしまった! document.write("<p>(2)順番に要素を格納しなかったとき<br>"); ShowArrayInfo(arr_sample_2); document.write("</p>"); //(3) var arr_sample_3 = new Array(); arr_sample_3[0] = "abc"; arr_sample_3[1] = "eef"; arr_sample_3.length = 21;//lengthプロパティに直接数字を格納してしまった。 document.write("<p>(3)lengthプロパティに直接格納<br>"); ShowArrayInfo(arr_sample_3); document.write("</p>"); // --> </script> </body> </html>
firefox1.5での結果は以下のようになり、すべて意図しないものとなっていることがわかります。なお、今回は省略しますが、連想配列の lengthプロパティもまったくあてになりません。何かにつけて緩すぎる...。
(1)確保数と実際の要素数が異なるとき
配列要素数:5
キー:0 値:abc
キー:1 値:def
(2)順番に要素を格納しなかったとき
配列要素数:6
キー:0 値:abc
キー:1 値:def
キー:2 値:ghi
キー:5 値:jkl
(3)lengthプロパティに直接格納
配列要素数:21
キー:0 値:abc
キー:1 値:eef