Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript字符串替换:我们可以使用字符串作为第一个参数(表示速度),但是;“全球匹配”吗;?_Javascript_String - Fatal编程技术网

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上测试它,然后查看。这并不是很难做到,不是吗?@Ejay
join
&
split
也可以,但是如果JS引擎没有做任何聪明的事情,它将分配一个由单独的字符串组成的数组,这些字符串相加原始字符串的长度(减去分隔符的数量)。这必须比正则表达式效率更低(特别是内存)。感谢您提供有关inf.loopthedynamicregex
newregexp(“.”,“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;
}