配列でのfor文・for-in文

最近までfor-in文はfor文の代わりに使えると思っていました。ですが、どうやらそれぞれ用途が違うようです。簡潔に書くと、

  • for文:配列に使用
  • for-in文:オブジェクトに使用 

ということに集約されそうです。
for-in文はオブジェクト(連想配列)のプロパティを1つずつとりだしてループする挙動をします。なので各回に参照するのはfor文のように数字等ではなくkey値、つまりStringになります。

​var ary = [1,2,3,4,5];

for(var i = 0; i < ary.length; i++){
console.log(typeof(i)); //iはNumberになる
}

for(var j in ary){
console.log(typeof(j)); //jはStringになる
}

なので、for-in文を使って配列内を検索して、条件に合致したもののIndex値を持ってきたいと思っても、実際には文字列になってしまっているので注意が必要です。

配列でもfor-in文が使えるのは、JavaScriptの自動型変換のおかげでしょうか。
(配列Arrayはオブジェクトを拡張したもので、自動的にKey値を0, 1, 2, 3・・・と割り振るためfor-inも使えるとどこかで見たことあるような気がしますが、確かではありません。調査したいと思います)