配列と連想配列と再帰関数のこと

hoge=function(arglst){
 if(isArray(arglst)){
   for(arg in arglst)
     hoge(arg);
 }else{
   hoge(arglst);
 }
} 
hoge([...]); #=> 配列の各要素に対してhoge()を実行 
hoge({...}); #=> 連想配列そのものに対してhoge()を実行

みたいな、ちょこっとだけ再帰する関数を書きたいなと思ってFirebugのコンソールで遊んでいたら、何だかうまくいかない。typeof使って調べてみたら配列も連想配列も同じobjectとして判定されていた。いやまあ、単純に仕様をいまひとつ理解していなかっただけなのだけれど。

下記のコードを実行したら何とも愉快な結果に。配列からは大量の関数の情報が見える。一方連想配列からはa,b,cの情報しか見えない。

prt=console.log
var keys= {a:10,b:20,c:30};
var lst = [1,2,3];
for(name in keys)
  prt(name,":",keys[name]);
for(name in lst)
  prt(name,":",lst[name]);

isArrayに相当する関数を自分でうまく作るには、とググっていたらjQueryでの判定の話がちょくちょく出てきたけれど、個人的に参考になるなと思ったのは id:fbis:20091112:1258002754 の記述。PHPのことだけれど基本的には同じことをやってやればいいはず。

そんで再帰云々に関しては、array.forEach使ってやれば丸投げ出来るので別に再帰にしなくてもいいかなー、とか。いやまあ、minibufferのaddCommandにいくつかのコマンドをまとめて登録するにはどうしたら楽かなーというのが今回の出発点なのでした。


追記
ちゃんと調べたらinstanceofもあるし、関数内ならargumentsも使えるしで、何も悩む必要がなかった。コードの道は深い。