2015年8月17日月曜日

JavaScriptの配列


JavaScriptの配列

JavaScriptにも他のプログラミング言語の同様に配列を装備しています。 ただし、JavaScriptの配列はCやJavaの様に最初に長さや型が決定される配列では無く、その柔軟さはむしろリストに近いでしょう
実態は配列Objectであり、pushやイテレーターなど様々なプロパティや機能が用意されています。

配列の宣言

JavaScriptの配列の宣言方法は主に2つあります。 配列リテラルを使う方法と、Arrayコンストラクタで生成する方法です。 以下はどちらも同じ配列になります。
//配列リテラル記法
var nums = [10, 20, 30];
document.writeln(nums); //10,20,30

//Arrayコンストラクタ
var nums = new Array(10, 20, 30);
document.writeln(nums); //10,20,30
配列コンストラクタで生成する方法は引数が一つだと、配列の長さになり複数の配列だと配列要素そのものになります。
// 10,20,30の3つの要素を持つ配列
var nums = new Array(10, 20, 30);
document.writeln(nums); //10,20,30

// 10つの空要素を持つ配列
var nums = new Array(10);
document.writeln(nums); // ,,,,,,,,,
この様にArrayコンストラクタは引数が一つか複数かによって生成される配列が変わり紛らわしいので通常は配列リテラルが使われます。 Arrayコンストラクタが有効な場面は配列の長さを先に決めることが出来る点です。
//要素は決定していなが100の長さの配列を確保しています。
var nums = new Array(100);
長さは自然数でなければならないので以下はErrorです
var nums = new Array(0.1); //少数を使用しているSyntexError
var nums = new Array(-1); //マイナスの整数SyntexError
宣言時に変数側にブラケットを書くことは出来ません。このあたりはCなどと違います。
// 10の要素を確保しようとするがSyntaxError
var arr[10] = new Array();
また、いきなりブラケット演算子を使用して配列にすることもできません。 配列変数は最初に配列であると宣言しなければいきなり要素にアクセスできません。
var nums[4] = 5; //SyntaxError いきなり要素に代入している

var nums = []; //まず宣言
var nums[4] = 5; // 前に配列宣言されていれば何番目に入れようとも可能

配列の要素

JavaScriptの配列は柔軟なので、要素数や型を気にせず入れることが出来ます。
var arr = [10, "str", true, function(arg) {}, null, undefined, {}];
console.log(arr); //[10, "str", true, function, null, undefined, Object]
ただし、何も考えずに入れても扱いにくいだけですので、通常はJSONの様に決まったフォーマットなどで有効な使い方でしょう。

配列要素のアクセス

配列要素へのアクセスには、ブラケット演算子[]の0から数えた要素の番号を添え字として指定します。 これはCやJavaなど他の言語と変わりないので特に違和感ないでしょう。
var nums = [10, 20, 30];
document.writeln(nums[1]); // 20が表示される
また配列にはlengthという特殊なプロパティがセットされ全体の長さを取得できます。 これも他の言語と同じような仕組みなので違和感無く使えるでしょう。それによりfor文で全要素にアクセスできます。
var nums = [10, 20, 30];

document.writeln("length = " + nums.length); 
for(var i = 0; i < nums.length; i++) {
    document.writeln(nums[i]);
}
結果:
length = 3
10
20
30

配列とオブジェクト

JavaScriptの配列の実態はArrayオブジェクトです。ですからオブジェクトとしてプロパティを持ちメソッドを使用できます。
var arr = ["one", "two", "three"];

document.writeln(arr.toString()); //文字列として表示
document.writeln(arr); //内部でtoStringメソッドが呼び出される
document.writeln("length = " + arr.length); //lengthプロパティで個数を出力
document.writeln(typeof arr);
結果:
one,two,three
one,two,three
length = 3
object

配列を出力させると自動的にtoStringメソッドが使用され、文字列として表示されます。 typeofでタイプを調べるとobjectが表示されるように実態はオブジェクトです。
lengthプロパティは特殊なプロパティで配列の個数を出力し配列の要素を追加すれば自動的に増えます。
arr.push("four"); //pushプロパティによる追加
document.writeln(arr);
document.writeln("length = " + arr.length);

arr[4] = "five";
document.writeln(arr);
document.writeln("length = " + arr.length);
結果:
one,two,three,four
length = 4
one,two,three,four,five
length = 5

以上は直感的にも理解できるでしょう。 では飛び値の要素を追加したりlength値自体に代入するとどうなるでしょうか?
arr[9] = "ten";
document.writeln(arr);
document.writeln("length = " + arr.length);
document.writeln(arr[5]);

arr.length = 3;
document.writeln(arr);
document.writeln("length = " + arr.length);
結果:
one,two,three,four,five,,,,,ten
length = 10
undefined
one,two,three
length = 3

このように飛び値までの要素はundefinedで埋められ配列の長さは与えられた数まで伸びます。 そしてlength自体に代入するとその長さまでの配列になります。lengthプロパティは単に配列と紐付けられた変数に過ぎないということが分かります。

0 件のコメント:

コメントを投稿