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