Javascript字符串替换:我们可以使用字符串作为第一个参数(表示速度),但是;“全球匹配”吗;?
Javascript字符串替换:我们可以使用字符串作为第一个参数(表示速度),但是;“全球匹配”吗;?,javascript,string,Javascript,String,string.replace(/\./g,'''.''.''是我喜欢的行为,但我不想使用实际的正则表达式,因为这表明使用字符串,例如string.replace('.',''.'''.''.'''.'要快得多 不幸的是(这对jsperf来说可能是一种诅咒,因为这一点在任何方面都不明显),看起来替换只会在第一场比赛中起作用,所以它与第一场比赛完全相同 string.replace(/\./,'_') 这可能足以使比较无效,因为纯字符串replace(在Webkit上)的速度实际上只有普通字符串的
string.replace(/\./g,'''.''.''
是我喜欢的行为,但我不想使用实际的正则表达式,因为这表明使用字符串,例如string.replace('.',''.'''.''.'''.'
要快得多
不幸的是(这对jsperf来说可能是一种诅咒,因为这一点在任何方面都不明显),看起来替换只会在第一场比赛中起作用,所以它与第一场比赛完全相同
string.replace(/\./,'_')
这可能足以使比较无效,因为纯字符串replace
(在Webkit上)的速度实际上只有普通字符串的两倍,但它实际上只做了1/4的工作,用空格代替一个句点,而不是全部句点
有一个明显的方法是
while(string.indexOf('.') !== -1) string = string.replace('.','_');
但是否有更好或更快的方法来实现这一点 您的jsperf不是一个公平的比较,因为
string.replace('.','''.')
实际上并没有做相同的工作。将替换1的代码与替换4的代码进行比较并不特别有用。一个更公平的比较(并通过展开循环给非正则表达式替换的最佳机会),您可以看到使用正则表达式实际上更快。等等。这:
string.replace( /./g, '_' )
与此不同:
string.replace( '.', '_' )
第一个字符将任何字符替换为下划线,而不仅仅是句点
你不是说:
string.replace( /\./g, '_' )
看看这对性能有什么影响;它可能比错误的更好
还有,你是不是连续做了很多这样的事情?性能是否重要?好吧。我已经修改了上一个测试来进行“替换循环”(不要介意原型附件,它只是一个测试)
在测试的浏览器中,预先创建的RegExp胜过其他浏览器,这是有充分理由的:
- 因为RegExp总是相同的,所以缓存它是一个好主意,而不是当场重新创建相同的对象
-indexOf
循环很慢,可能是因为重复replace
和indexOf
操作<代码>替换每次运行时都会创建一个新字符串,这可能是原因replace
-split
速度很慢,可能是因为浏览器必须先创建数组,然后创建字符串,然后放弃数组。虽然浏览器可能已经优化了数组的创建,但仍然比较慢join
“这是字符串”。拆分(')。连接(“”)代码>并不是一个死板的循环,但是while循环将是一个无限循环:在jsperf上测试它,然后查看。这并不是很难做到,不是吗?@Ejayjoin
&split
也可以,但是如果JS引擎没有做任何聪明的事情,它将分配一个由单独的字符串组成的数组,这些字符串相加原始字符串的长度(减去分隔符的数量)。这必须比正则表达式效率更低(特别是内存)。感谢您提供有关inf.loopthedynamicregexnewregexp(“.”,“gm”)的提示代码>是错误的。这个点应该转义。@plalx:是的,在Michael的评论之后我也注意到了。是的,我从其他地方提升了jsperf,并且没有对它进行太多维护。在OP发布的性能中,他们确实正确地转义了
,但是他们的“动态”正则表达式的大小写是错误的,实际上用空格替换了所有字符。啊,是的。很抱歉匆忙写下的问题案例2和3不正确。它们将替换所有字符。它应该是newregexp(“\\”,“gm”)代码>@MattBurland在我看到所有评论后,目前正在测试。马上更新。
String.prototype.loopReplace = function(replacee,replacer){
var result = this;
while(!!~(result = result.replace('.',' ')).indexOf('.')){}
return result;
}