看下面的代码:

var foo = [];
foo[0] = 'a';
foo[2] = 'c';
alert(foo.length);

foo['name'] = 'lifesinger';
alert(foo.length);

var foo2 = [];
foo2['3'] = 3;
foo2['age'] = 20;
alert(foo2.length);

var foo3 = {};
foo3['age'] = 30;
alert(foo3.length);

对alert的输出结果是否感到有点惊讶?从上面的代码中,我们可以总结出以下规律:

  1. 对普通数组(key为自然数,从0开始依次增大1)来说,length是预期的结果
  2. 对关联数组来说,当key中有自然数时,length等于key中的最大自然数 + 1, key中没有自然数时,length为0
  3. 对象默认是没有length属性的

小心length, 别掉进代码的陷阱里。

更新:

  1. JavaScript没有关联数组,key/value pair直接是对象提供的。感谢realazy指点。
  2. 对于key中含有非自然数的数组,可以分成两部分来看:一部分是数组本身的键值对,另一部分是对象的属性。length是针对数组部分而言的,因此始终等于 0 或 key中的最大自然数 + 1.