概要
javascriptの配列について、要素へのアクセス方法について試してみます。
配列への代入
配列の要素にアクセスする方法は[]演算子を使います。
具体的には次のようなコードになります。
//要素が空の配列を作成 let test1 = []; //要素の1に値を代入 //(この時、配列の0番目はemptyで空なので全体の要素数は1つ) test1[1] = 10; //要素の0に文字列「abc」を代入 test1[0] = "abc"; //要素へのアクセスに変数を使う(その1) let arr_str = 4 test1[arr_str] = "efg"; //要素へのアクセスに式を使う(その2) let arr_cal = 5; test1[arr_cal + 10] = "hij";
便宜上、開発ツールのログ出力命令は省略していますが、出力結果は次のようになります。
Array [ <1 empty slot>, 10 ] Array [ "abc", 10 ] Array(5) [ "abc", 10, <2 empty slots>, "efg" ] (16) […] 0: "abc" 1: 10 4: "efg" 15: "hij" length: 16 <prototype>: Array []
(<>で表現している箇所は、ブログの構造上、半角文字の「<>」ですが、表示エラーになるので全角にしています)
上記の4つ目の出力結果だけは、配列を展開した形で出力を確かめています。
代入した値の取得
次に配列に代入した値を取り出してみます。
ここで注意が必要なことは、上記の例で配列で値を代入する場合、
配列のインデックスとしての「1」を使っていますが、実際は文字列の1として要素名を確定していることです。
これは[]演算子を使って配列の値を代入する場合の動作になるので注意が必要です。
値を取り出すには次のような書き方をします。
console.log(test1[0]); console.log(test1[1]); console.log(test1[13]);
便宜上、console.logで出力していますが、実際には「test1[0]」のように記述します。
上記の実行結果は、値が正常に取得できた場合は、配列内の値を取得、
インデックスが正しくない、存在しない場合は、undefinedが出力されます。
上記の例は次のようになります。
abc 10 undefined
当然、3番目の例は、配列のインデックスの13には要素を代入していないので、値の取得ができずにundefinedになります。
javascriptでは配列の値が取得できない場合はエラーで処理落ちすることなく、undefinedになるので注意が必要です。
配列の要素数について
配列を定義し、値を代入して利用すると、代入した数だけの要素が増えることになります。(要素を削除しない限りは)
要素数を出力するには、lengthプロパティを使います。
console.log(test1.length);
上記の出力結果は「16」となります。
ここで16となる理由を考察してみると、全ての要素に値を格納されている訳ではなく、
一番最初の値の代入の際に
let arr_cal = 5; test1[arr_cal + 10] = "hij";
という配列の添え字に整数を使って代入した為、配列のインデックスとして解釈され、0から15までの要素が作成された為になります。
この時、途中で要素の代入をしていないインデックスは空(undefined)という形で要素が生成されます。
上記の考えにより「console.log(test1[13]);」という出力は「undefined」という形で出力されると言えます。
配列のインデックスに非整数値を使った場合
ここまでは配列のインデックスに数値を使ってきましたが、
あえて文字列を設定して代入と取得を試してみます。
次のようなコードを書いて実行してみます。
let test2 = []; test2["z"] = 10; console.log(test2);
出力結果は
[] length: 0 z: 10 <prototype>: Array []
のようになります。
配列のN番目に値が格納されているわけではなく、配列のプロパティ名「z」に対して、値「10」が格納されていることになります。
試しに、この配列に対して、0番目や1番目の要素を取得してみます。
console.log(test2[0]); console.log(test2[1]);
出力結果は、共に「undefined」になります。
また、この状態で配列test2に対してlengthを取得してみます。
console.log(test2.length);
出力結果は、「0」になります。
配列のインデックスに非整数値を使った場合(その2)
では、配列のインデックスにマイナスの値を使うとどうなるか試してみます。
次のようなコードを書いて実行します。
let test3 = []; test3[-50] = 100; console.log(test3);
出力結果は次のようになります。
[] "-50": 100 length: 0 <prototype>: Array []
インデックスに「-50」と指定しましたが、この場合の動きは要素の「数」としてのインデックスではなく「-50」というプロパティ名として解釈され、「-50」の要素として「100」が配列に格納されている動きになります。