JavaScript: 字符串和数组的indexOf方法效率差异

7

我很好奇在JavaScript中,Array和String都可以使用indexOf方法,它们之间的效率是否会有所不同。我认为,在String上使用indexOf方法的效率要低于在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); 

我在Node中进行了此测试,新的测试结果显示:

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

因此,相对于字符串而言,数组对于indexOf更有效。这个新的测试基本上创造了最坏的情况——即字符串或数组的结尾是目标字符。

编辑:

如果在数组上 indexOf 更有效率,那么在使用 indexOf 方法搜索子字符串之前,我们是否应该先将字符串(例如按逗号分隔)拆分为数组?

对于这个字符串:

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

如果你搜索 "ocean",你会先将字符串 "str2" 分割成数组,然后使用 indexOf 方法来查找 "ocean" 吗?
var arr2 = str2.split(",");
arr2.indexOf('ocean');

我不知道你的假设是什么,也不知道为什么。说实话,我甚至不知道你在问什么。 - user1106925
我同意Squint的观点。这些操作做的事情完全不同。这就像问是否使用十字头螺丝刀拧松螺丝更有效,还是用夜游钓鱼来捕捉河豚更好一样荒谬。什么是目标或场景,差异在其中很重要呢? - Thriggle
1
数组的一个好处是,它可以通过先比较字符串长度来避免实际的逐个字符比较。只有当长度匹配时才进行字符比较。现在你似乎在想是否应该先拆分,但这也会产生相当大的开销。对于关于性能的许多问题,都取决于具体情况。 - user1106925
2
是的,这两种方法有相同的名称,那又怎样呢?数组和字符串是完全不同的数据结构,它们的indexOf方法的算法和实现也是如此。这不是一个应用于两个数据结构的单一函数,它们是两个非常不同的函数。那么,这个问题的重点是什么? - Leo
1个回答

2
我猜你想使用indexOf来检查一个以字符串开头的列表中是否存在给定元素。
那么有两个选项,一是直接在字符串上使用indexOf,二是先将其解析为数组,然后查看元素是否存在于其中,因为你知道格式是“item1,item2”。

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

根据这个jsperf,我们可以看到尽管对于数组本身而言indexOf更快,但将字符串转换为数组也有成本,因此最好在原始字符串上执行indexOf。
*请注意,String indexOf需要进行一些额外的修改,以确保indexOf(“ocean”)不会在您拥有像blueocean这样的元素时返回true,并且可能希望使用indexOf(“,ocean,”)代替。

有趣的比较!我添加了另一个测试,用于使用正则表达式:http://jsperf.com/indexof-array-vs-string-efficiency/2 - TonyGW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接