白猫のメモ帳

C#とかJavaとかJavaScriptとかHTMLとか機械学習とか。

[]と{}は違うんよ

JavaScriptなお話。


配列のインスタンスを生成するとき、

var ary = new Array():

もしくは

var ary = []:

って書く。

初期化も同時にしたいときには、

var ary = ['A','B','C'];

って書く。

中身を設定したいときには、

ary.push('D');

って書く。

で、中身をイテレートする時には、

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

ってな風になる。


一方で、連想配列インスタンスを生成するとき、

var obj = new Object():

もしくは

var obj = {}:

って書く。

初期化も同時にしたいときには、

var obj = [a : 'A', b : 'B', c : 'C'];

って書く。

中身を設定したいときには、

obj.d = 'D';
obj['e'] = 'E';

って書く。

で、中身をイテレートする時には、

for (var key in obj){
  alert(obj[key]);
}

ってな風になる。


特に問題はない。
が、こんなこともできる。

var ary = new Array():
ary['a'] = 'A';

これはいったい何者なんだろう。
配列?連想配列

どちらも正解のようなそうでもないような…。
というかJavaScriptには連想配列なんていうものはない。
そんな感じの動きをするから、そんな感じの名前なだけ。

要するに連想配列っていうのは、そのObjectのプロパティに値を詰めたり出したりしているだけ。
ArrayもObjectの一種だからプロパティに設定はできるよってこと。


じゃあ区別しなくていいのかというと、そういうわけじゃない。
具体的には、Arrayにはlengthがあるけど、Objectにはない。

jQueryのeachのように、配列でも連想配列でもイテレートできるような関数を使うとはまる。

var obj = {};
obj["a"] = "A";
$.each(obj, function(key, val){
    alert(key + ":" + val);
}

はOKだけど、

var ary = [];
obj["a"] = "A";
$.each(ary, function(idx, val){
    alert(idx + ":" + val);
}

はうまくいかない。