JavaScript:String和Array上indexOf方法的效率差异

时间:2015-10-10 03:03:19

标签: javascript arrays string substring indexof

我很好奇JavaScript中indexOfArray可用的String方法的效率是否存在差异。我认为indexOf在String上的效率低于在Array上的效率,而我的测试结果支持这一点。例如:

var arr = ['abc', 'ab', 'abz', '1'];

var str = 'abcababz1';

var needle = 'abxx';

//concatenate to make them bigger
for (var i = 0; i < 30; i++) {
    arr = arr.concat(arr);
    str = str.concat(str);
}
arr.push(needle);  //append needle last
str = str.concat(needle);

然后我使用

的开始和结束时间戳
arr.indexOf(needle); // faster!
str.indexOf(needle); 

我在节点中做了这个测试,新的测试结果显示:

time used on Array is: 35
time used on String is: 57

因此,Array对indexOf比String更有效。这个新测试基本上会创建最坏的情况 - 在String或Array的最后一针。

修改

如果indexOf在Array上效率更高,我想知道在使用indexOf方法搜索a之前是否应首先将String(例如用逗号分隔)拆分为数组子串。

对于这个字符串:

var str2 = "hello,world,country,continent,ocean"

如果您搜索ocean,是否首先将字符串str2拆分为数组,然后使用indexOf查找ocean

var arr2 = str2.split(",");
arr2.indexOf('ocean');

1 个答案:

答案 0 :(得分:2)

我根据您的编辑猜测您要使用indexOf来检查列表中是否存在以字符串形式开头的给定元素。

然后两个选项是在字符串本身上使用indexOf或首先将其解析为数组并查看该元素是否存在,因为您知道格式为&#34; item1,item2&#34;。

http://jsperf.com/indexof-array-vs-string-efficiency

基于jsperf,我们可以看到,尽管indexOf在数组本身上更快,但将字符串转换为数组也会产生成本,并且您最好不要对原始字符串执行indexOf。

*请注意,String indexOf需要进行一些额外的修改,以确保如果你有像blueocean这样的元素,indexOf(&#34; ocean&#34;)不会返回true,并且可能会想要indexOf( &#34;,海洋,&#34)