配列について

少しJavaScriptのオブジェクトに関して理解できたと思う。

で配列ってのが微妙らしい。基本的に配列の宣言は「var array = [];」で統一しようと思う。どこかで「new」は使わない方がいいって言ってた。何故使わないほうがいいか理解していないのがダメなところなんだが、その辺は、また今度確認しよう。ちなみにオブジェクトは「var obj = {};」とする。

var init = function() {
  var numArray = [1,2,3,4,5,6,7];

  for (var i = 0, n < numArray.length; i < n, i++) {
    alert(numArray[i]);
  }
}

何の変哲もない、配列に格納されている値を順番に表示するだけ。

var init = function() {
  var numArray = [1,2,3,4,5,6,7];

  alert(numArray.length);
  numArray.push(8);
  alert(numArray.length);
}

これも何でもないね。「7」「8」と表示される。lengthは配列のインデックス+1(ちなみにインデックスは0から開始)の数を表示する。と言う事で、こうするとどうなるのか試してみた。

var init = function() {
  var numArray = [1,2,3,4,5,6,7];

  alert(numArray.length);
  numArray[10] = "Hello";
  alert(numArray.length);
  numArray["say"] = "Hello!";
  alert(numArray.length);
}

「7」「11」「11」となるね。

つまり、lengthは常にインデックスの最大値+1を返すってことですね。あと、インデックスと認識されないもの「say」とかは無視されます。面白いですね。JavaScriptの配列はオブジェクトと同じような扱いで、配列の添え字はオブジェクトにキー値を追加しているようなものって理解でいいのかな〜ん〜なんか全部ハッシュに思えてきたのだが、その考えでいいのだろうか疑問だ。めんどくさいから配列もオブジェクトもハッシュでいいかな、それぞれの違いは配列では配列で利用できる関数があるってことで、それはオブジェクトとは異なるところ。

var init = function() {
  var numArray = [1,2,3,4,5,6,7,8,9];

  alert(numArray.length);
  numArray[5000] = 99;
  alert(numArray.length);
}

当然のことのように「9」「5001」が表示された。

「numArray[5000]」の場合は、利用していない添え字ってどうなってんの?どこかで宣言されているの。その場合、めっちゃメモリが無駄になると思うのだが、と言うわけで確認。

  alert(numArray.join());

何が出てきたか・・・「1,2,3,4,5,6,7,8,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,・・・,99」これは・・・全部宣言されて空白で埋められているって事ですか?本当ですか?物凄く無駄ですよね。残念です。

var numArray = [];
numArray[10000] = 1;

for (var i = 0, n = numArray.length; i < n; i++) {
  alert("Hello!");
}

とすると、10000回「Hello!」がポップアップするのですね。いやだな

要素が指定してある回数分処理を行いたいのであれば、

var numArray = [];
numArray[10000] = 1;

for (var key in numArray) {
  alert("Hello!");
}

とすると、1回しか「Hello!」は表示されない。「in」は重宝するようで配列だけでなくオブジェクトにも利用できる。オブジェクトのどんな要素が宣言されているのかとかにも利用できる。

簡単に言うと・・・ハッシュのキー値を取得できるってやつですね。下記のようにするとキー値とバリュー値を取得でいますね。配列もオブジェクトもハッシュと考えているんだがいいのだろうが・・・

var obj = {
  name: "Taro, YAMADA",
  age: "20",
  addr: "Tokyo in Japan".
  sex: "male",
  say: "Hello, Morning!"
};
var init = function() {
  for (var key in obj) {
    alert(key + " : " + obj[key]);
  }
}
init();  // ここはOnClickイベントのところに書いてね

と言う事だ。ちなみに、alertの「obj[key]」で多少つまづいた。

obj.keyとかくとobjオブジェクトの要素keyを見に行き、そんなものはないと言われ、undefindとなる
obj["key"]とすると、同様にobjオブジェクトのキー値「key」を探しに行き、undefindとなる。

JavaScriptは奥が深いと思った。では