JavaScript中Array与Object集合的性能对比

作者:寒星时间:2026-10-24 13:30:44浏览:160

本文对比JavaScript中Array与Object作为集合的使用方式。Array遍历检索时间复杂度为O(n),而Object通过键值直接访问可达O(1)。实测显示,在大规模数据映射场景下,使用Object模拟集合可将耗时从数十秒降至数秒,显著提升检索效率。

尽管该集合的键(key)仅支持String类型,无法像Java集合类那样使用任意对象作为Key,但对于实现常规客户端JavaScript功能而言已完全足够。此外,由于所有JavaScript内部对象均继承自Object,因此JS中的Array对象实际上也可以使用字符串作为数组下标,这与PHP中的数组变量用法类似。



JavaScript集合类型对比

数组是JavaScript内置的标准集合对象,支持通过push添加元素、通过shift删除元素,并可通过for循环进行遍历。那么,除了数组之外,JavaScript中是否还存在其他形式的集合?



得益于JavaScript的语言特性,我们可以向通用对象动态添加和删除属性,因此Object也可以被视为JS中的一种特殊集合。以下对Array和Object的特性进行对比:



Array:



新建:var ary = new Array(); 或 var ary = [];


增加:ary.push(value);


删除:delete ary[n];


遍历:for ( var i=0 ; i < ary.length ; ++i ) ary[i];



Object:



新建:var obj = new Object(); 或 var obj = {};


增加:obj[key] = value; (key为string)


删除:delete obj[key];


遍历:for ( var key in obj ) obj[key];



从上述对比可以看出,Object完全可以作为集合使用。在介绍Popup窗口创建无限级Web页菜单(3)时提到的Eric实现的__MenuCache__,正是利用Object模拟集合对象的典型例子。



若要在Array中检索指定值,必须遍历整个数组:


代码如下:

var keyword = ;
for ( var i=0 ; i < ary.length ; ++i )
{ 
if ( ary[i] == keyword )
{ 
// todo
} 
} 

而在Object中检索指定key对应的条目,只需直接引用:



var key = '';


var value = obj[key];


// todo



Array与Object检索性能差异

Object的这一特性使其能高效检索唯一字符串集合。Array遍历的时间复杂度为O(n),而Object检索的时间复杂度为O(1)。虽然对于10000次集合的for检索代价仅几十毫秒,但当进行1000*1000次或更多检索时,Object的优势便凸显出来。此前进行的一项映射测试中,将100个Unique字符映射到1000个字符串数组上,耗时25-30秒;随后将for遍历改为使用Object模拟集合的成员引用,相同数据量的映射耗时仅为1.7-2秒。



集合遍历效率排序(从高到低):var value = obj[key]; > for ( ; ; ) > for ( in )。其中for ( in )效率最低,若集合规模过大,应尽量避免使用for ( in )进行遍历。

作者最新文章