IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

JavaScript の配列と連想配列の違い

id:cheesepie:20070131:1170172709

最近は、こういう風に JavaScript を勉強する人が増えていてとても嬉しいです ^^ id:cheesepie さん頑張ってください!
で、ちょっと配列と連想配列の使いかたが違うようなので、エントリーを書こうと思いました。おせっかいだったらすみません>< ! やっぱり、このへんが JavaScript の難しいところのひとつなのだろうか。

ということで、 JavaScript配列と連想配列の違い

いってみよおー

連想配列とは

JavaScript では連想配列は一番シンプルなオブジェクトのことである。つまり、すべてのオブジェクトは連想配列である。
以下のすべての連想配列はまったく同じものである。

// 1
var obj = { hoge: 'hoge' };

// 2
var obj = { 'hoge': 'hoge' };

// 3
var obj = {};
obj.hoge = 'hoge';

// 4
var obj = {};
obj['hoge'] = 'hoge';

// 5
var obj = new Object();
obj.hoge = 'hoge';

この hoge のように連想配列のキーになるシンボルのことをプロパティという

配列とは

配列プロトタイプを継承したオブジェクトのことである。
以下のすべては同じ配列である。

// 1
var array = ['hoge', 'fuga'];

// 2
var array = new Array('hoge', 'fuga');

// 3
var array = Array('hoge', 'fuga');

// 4
var array = [];
array[0] = 'hoge';
array[1] = 'fuga';

// 5
var array = [];
array['0'] = 'hoge'
array['1'] = 'hoge'

// 6
var array = { 0: 'hoge', 1: 'fuga', length: 2 };
array.__proto__ = Array.prototype;

6 の例が分かれば、 JavaScript配列は分かったも同然である。

走査のしかた

for in配列走査のための記法ではない

for in配列の走査の目的では使ってはいけない。たとえば、以下のようにプロトタイプが拡張された場合に対応出来なくなってしまう。

Array.prototype.hoge = function() {};

for (var i in ['a', 'b', 'c']) {
  alert(i); // 1, 2, 3, hoge が表示される
}

for inオブジェクトプロパティを走査する記法だからだ。
では、 length プロパティは何故走査されないか。それは、 length が特別な DontEnum プロパティだからだ。基本すべてのプロパティは走査される。

配列は素直に for
var array = ['hoge', 'fuga'];

for (var i = 0; i < array.length; i ++) {
  alert(array[i]);
}
連想配列には for in
var hash = { hoge: 'hoge', fuga: 'fuga' }

for (var i in hash) {
  alert(hash[i]);
}

こんな感じでどうでしょう。

以上、おせっかいエントリーでした><