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

Posted

技术标签:

【中文标题】JavaScript:String 和 Array 上 indexOf 方法的效率差异【英文标题】:JavaScript: difference in efficiency of indexOf method on String and Array 【发布时间】:2016-01-08 02:00:54 【问题描述】:

我很好奇 javascriptArrayString 都可用的 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,Array 比 String 更有效。这个新的测试基本上创造了最坏的情况——在字符串或数组的最后一个针。

编辑:

如果indexOf 在数组上更有效,我想知道我们是否应该先将字符串(例如用逗号分隔)拆分为数组,然后再使用indexOf 方法搜索子字符串。

对于这个字符串:

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

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

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

【问题讨论】:

我不知道你的假设是什么或为什么。就此而言,我什至不知道你在问什么。 我对这个有点斜视。这些操作做了两个不同的事情。这就像问使用十字头螺丝刀拧松螺丝或使用夜行器抓大眼虫是否更有效。差异很重要的最终目标或场景是什么? 数组的一个好处是它可以通过首先比较字符串长度来避免实际的逐字符比较。如果长度匹配,它只会进行字符比较。现在您似乎想知道是否应该先拆分,但这也会产生相当多的开销。与许多关于性能的问题一样,这完全取决于具体情况。 是的,这两个方法的名称是相同的,然后呢?数组和字符串是完全不同的数据结构,它们的indexOf 方法的算法和实现也是如此。它不是应用于两个数据结构的单个函数,它们是两个非常不同的函数。那么,这个问题的意义何在? 【参考方案1】:

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

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

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

基于该 jsperf,我们可以看到,尽管 indexOf 在数组本身上更快,但将字符串转换为数组也是有代价的,最好对原始字符串执行 indexOf。

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

【讨论】:

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

以上是关于JavaScript:String 和 Array 上 indexOf 方法的效率差异的主要内容,如果未能解决你的问题,请参考以下文章

Javascript Array和String的互转换

JavaScript-----14.内置对象 Array()和String()

JavaScript 从JSON / Object / Array到STRING

JavaScript内置对象及相关练习(math对象,date对象,string对象,array对象)

JavaScript ---[内置对象之String字符串,Array数组,Date,Math]

Javascript-string-Array