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

JavaScript: difference in efficiency of indexOf method on String and Array

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

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); 

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

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

因此数组对于 indexOf 比 String 更有效。这个新测试基本上创造了最坏的情况——针在字符串或数组的最后。

编辑:

如果indexOf在Array上效率更高,我在想是不是要先把一个String(比如用逗号分隔)拆分成一个数组再用indexOf方法查找对于子字符串。

对于这个字符串:

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

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

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

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

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

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

基于那个 jsperf 我们可以看到,即使数组本身的 indexOf 速度更快,将字符串转换为数组也会产生成本,您最好在原始字符串上执行 indexOf。

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