JavaScript: String 和 Array 的 indexOf 方法效率差异
JavaScript: difference in efficiency of indexOf method on String and Array
我很好奇在JavaScript中Array
和String
都可用的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 (", 海洋,")
我很好奇在JavaScript中Array
和String
都可用的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 (", 海洋,")