length は配列の要素数ではなく「インデックス最大値 + 1」を表す

JavaScript配列のlengthプロパティは「配列にどれだけ値が格納されているか」を表すものではありません。結論を言うとlengthプロパティは、「インデックス最大値 + 1」を表す値で自動的に更新される特殊なプロパティなのです。

JavaScriptの配列をも〜っと深く理解する:lengthの不思議な動作 - builder by ZDNet Japan

(;・`д・´)な、なんだってー!?(`・д´・(`・д´・;)
ほんとにヘンなプロパティだなぁ。

このことから、配列の値を走査する場合は「for (var i = 0; i < a.length; i++)」とやるよりも、in演算子を用いた方が速いことが多いです。

JavaScriptの配列をも〜っと深く理解する:lengthの不思議な動作 - builder by ZDNet Japan

どれどれ。
以下のスクリプトFirebug で実行して試してみる。

var bench = function(func) {
  var start = (new Date()).getTime();
  func();
  var end   = (new Date()).getTime();
  console.log(end - start);
};

var ary = [1, 2, 3];
ary[1000000] = 4;
bench(function() {
  for (var i = 0, l = ary.length; i < l; i++) {
    ;
  }
});
bench(function() {
  for (var item in ary) {
    ;
  }
});


実行結果。

94
0

ほんとだ。
さすが 4 回のアクセス。

ただし、配列の添え字を飛び飛びで使用することはあまりないでしょうから、気にする状況は限られてくるでしょう。

JavaScriptの配列をも〜っと深く理解する:lengthの不思議な動作 - builder by ZDNet Japan

そうですね。
でもこんな面白いことが知れてよかったです。
連番で要素が入ってない配列を見かけたらこのことを思い出したい。