javascriptで色々連想配列だったり、色々オブジェクトだったりするのを理解する。
色々不正確な知識ばかりが詰まってる脳内をどうにかしたいものだ。。。
愚痴は少しにして、本題。
すべてがオブジェクト。すべてがハッシュ(連想配列)
javascriptは配列もハッシュもオブジェクトもすべて同じもの。
すなわち、連想配列らしい。
まぁ、知識としては知ってたけど、いまいち実感がないので、試す。
配列
var array = new Array(); array[0] = 1; array[1] = 2; array[2] = 3; alert(array[0] + " " + array[1] + " " + array[2]); //1 2 3
普通の配列。
連想配列
var hash = new Object; hash["moji"] = "de"; hash["key"] = "value"; alert("hash[\"moji\"] " + hash["moji"]); //hash[moji] de alert("hash[\"key\"] " + hash["key"]); //hash[key] value
これも普通の連想配列。
配列と連想配列が同じと知る
こんなコードを書いてみる
var a = new Array(); a[1] = 1; alert("数値としてアクセス " + a[1]); alert("文字としてアクセス " + a["1"]);
結果はどちらも、【1】と表示される。
数値としてアクセスしようと、文字としてアクセスしようと、同じことなのだ。
配列とは数値がキーになった連想配列でしかない。
こんなこともしてみる。
var array_or_hash = new Array(); array_or_hash[1] = "array"; array_or_hash["1"] = "hash"; alert(array_or_hash[1]); //hash
数値としてアクセスしても、hashと表示される。
この二つは同義なので上書きされたようだ。
オブジェクト
配列も関数もすべてオブジェクト。
そして、そのオブジェクトにはプロパティも持たせることができる。
var human = new Object(); human.name = "john"; human.age = 20;
こんな感じ。
そして、連想配列も持たせることができる。
human["home"] = "america";
さて、この状態で、こんな呼び出し方をしてみよう。
alert(human.name + "さん " + human.age + "才 " + human["home"] + "出身"); alert(human["name"] + "さん " + human["age"] + "才 " + human.home + "出身");
プロパティとして定義した値を、連想配列として呼び出し、連想配列として定義した値を、プロパティのように呼び出している。
結果は、どちらも、【johnさん 20才 america出身】と表示される。
すなわちどちらも同じこと。
すべて連想配列だとわかる。
最後にこんな実験
var obj = new Object(); obj.object = "object?"; obj[1] = "array?"; obj["hash"] = "hash?"; for (var prop in obj) { alert(prop + " " + obj[prop]); }
こんなごちゃまぜオブジェクトを for in してみる。
結果は、
object object? 1 array? hash hash?
やっぱすべて連想配列なんだね。