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

Ton*_*yGW 5 javascript arrays string substring indexof

我很好奇是否存在indexOf可用于JavaScript ArrayStringJavaScript 的方法的效率差异.我认为indexOfString上的效率低于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);
Run Code Online (Sandbox Code Playgroud)

然后我用了开始和结束时间戳

arr.indexOf(needle); // faster!
str.indexOf(needle); 
Run Code Online (Sandbox Code Playgroud)

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

time used on Array is: 35
time used on String is: 57
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

对于这个字符串:

var str2 = "hello,world,country,continent,ocean"
Run Code Online (Sandbox Code Playgroud)

如果你搜索ocean,你会先将字符串拆分str2成一个数组然后indexOf用来查找ocean吗?

var arr2 = str2.split(",");
arr2.indexOf('ocean');
Run Code Online (Sandbox Code Playgroud)

Dav*_* Li 2

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

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

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

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

*请注意,如果您有像 blueocean 这样的元素,则 String indexOf 需要进行一些额外的修改,以确保 indexOf("ocean") 不会返回 true,并且可能需要 indexOf(",ocean,")