JavaScriptで配列かハッシュかを区別するには?(その2)
- とても”奇妙”なJavaScriptの配列:JavaやCとは違うのだよ - builder by ZDNet Japan
- JavaScriptの配列をも〜っと深く理解する:lengthの不思議な動作 - builder by ZDNet Japan
この2つの記事を読んで、配列には length プロパティがあるが、ハッシュには length プロパティがないことを知った。
var obj; obj = [ 'value' ]; alert(obj.length); // 1 が表示される obj = { 'key': 'value' }; alert(obj.length); // undefined が表示される
これを利用すれば、
if (obj.length) // 配列 else // ハッシュ
でいけそうな気もしたが、この判定にも一つ問題があり、
var obj = { 'length': 'value' }; if (obj.length) // 配列 → obj はハッシュなのにこっちの制御に入ってしまう else // ハッシュ
ハッシュに 'length' というキーを持てない、という制限が付いてしまう。
じゃあ他に、渡されたオブジェクトが配列かハッシュかを区別する方法がないものだろうかと探していたら、
if (Array.prototype.isPrototypeOf(obj)) // 配列 else // ハッシュ
で、うまく動いた。(IE7 と Firefox2 で確認。)
しかし、 isPrototypeOf の意味がよく分かっていないので調べてみたいと思う。