小心数组的length
看下面的代码:
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的输出结果是否感到有点惊讶?从上面的代码中,我们可以总结出以下规律:
- 对普通数组(key为自然数,从0开始依次增大1)来说,length是预期的结果
- 对关联数组来说,当key中有自然数时,length等于key中的最大自然数 + 1, key中没有自然数时,length为0
- 对象默认是没有length属性的
小心length, 别掉进代码的陷阱里。
更新:
- JavaScript没有关联数组,key/value pair直接是对象提供的。感谢realazy指点。
- 对于key中含有非自然数的数组,可以分成两部分来看:一部分是数组本身的键值对,另一部分是对象的属性。length是针对数组部分而言的,因此始终等于 0 或 key中的最大自然数 + 1.

January 23rd, 2009 on 17:42
除了 foo['3'] 与 foo[3] 效果一样没有想到外,别的结果和我想的一样。
January 23rd, 2009 on 17:46
JS 没有关联数组的概念,都是直接把对象当作关联数组(因为它提供了 key/value 的适用性)来用的。不过有个陷阱,因为 Array 本身也是对象,同样可以设置 key/value,容易混淆。
记住 JS 没有关联数组,就知道为何有 length 的误解了。你总结的第二点中实际上是要计算除了对象本身属性(ownProperty)外的 key/value pair 的数量。遗憾的是,JS 内置也没有相应的办法。
推荐你看:
http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/
January 23rd, 2009 on 20:20
感谢realazy指点,明白了^o^
January 24th, 2009 on 17:40
不看不知道,一看吓一跳。
平时没注意到……….
March 4th, 2009 on 10:35
Ecma-262的p97-98有一段叙述了数组put时的过程:
可以看出,对于ToUint32(P)!=P的情况,只进行到8.就return了,不会改变A.length。
而10.中也可以看出,当ToUint32(P)>=A.length的时候,就改变A的length为ToUint32(P)+1了。
leave a reply