我的印象是indexOf
基本上是幕后的for
循环。但是,请考虑以下事项:
const str = 'abcdefjhijklmnopqrstuvwxy'.repeat(10000) + 'z';
let before, after;
before = Date.now();
str.indexOf('z');
after = Date.now();
console.log('Time for indexOf', after - before);
before = Date.now();
for (let i = 0; i < str.length; i++) {
if (str[i] === 'z') {
break;
}
}
after = Date.now();
console.log('Time for for loop', after - before);
&#13;
当字符串足够长时,为什么indexOf
会更快?
答案 0 :(得分:1)
您可以使用for
循环进行一些进一步的优化:首先,不要在每次迭代时重新计算字符串的长度。其次,请勿重新分配(=
) - 您希望比较(与===
)。第三,在查看非常小的时间尺度时,请使用performance.now()
代替Date.now()
:
const str = 'abcdefjhijklmnopqrstuvwxy'.repeat(1000000) + 'z';
let before, after;
before = performance.now();
str.indexOf('z');
after = performance.now();
console.log('Time for indexOf', after - before);
const strArray = [...str];
const strLength = strArray.length;
before = performance.now();
for (let i = 0; i < strLength; i++) {
if (strArray[i] === 'z') {
break;
}
}
after = performance.now();
console.log('Time for for loop', after - before);
但是for
循环仍然有不必要的包袱 - 字符串上的indexOf
可以在比for
循环中的代码更低的级别上运行 - 正好迭代字符串中的字符它的目的是什么 - 所以indexOf
跑得更快。