4

string.replace(/\./g,'_')是我想要的行为,但我宁愿不使用实际的正则表达式,因为这个 jsperf表明使用字符串 egstring.replace('.','_')更快。

不幸的是(这对于 jsperf 来说可能是一种诅咒,因为这在任何方面都不是很明显)看起来替换只会在第一场比赛中起作用,所以它只与

string.replace(/\./,'_')

这可能足以使比较无效,因为它实际上只比普通字符串快两倍(在 Webkit 上)replace,但实际上只用空格替换一个句点而不是全部替换它实际上只完成了 1/4 的工作。

有一个明显的方法是

while(string.indexOf('.') !== -1) string = string.replace('.','_'); 

但是否有更好或更快的方法来实现这一目标?

4

3 回答 3

1

等一下。这个:

string.replace( /./g, '_' )

与此不同:

string.replace( '.', '_' )

第一个用下划线替换任何字符,而不仅仅是句点。

你不是说:

string.replace( /\./g, '_' )

看看这对性能有何影响;它可能比不正确的要好。

另外,你连续做很多这些吗?性能甚至重要吗?

于 2013-05-05T00:24:22.293 回答
0

您的 jsperf 不是一个公平的比较,因为string.replace('.','_')它实际上并没有做同样的工作。将替换 1.的代码与替换 4.的代码进行比较并不是特别有用。这是一个更公平的比较(并通过展开循环给非正则表达式替换最佳机会),您可以看到使用正则表达式实际上更快。

于 2013-05-05T00:22:05.030 回答
0

好吧,性能测试不言自明我已经修改了最后一个测试来做一个“替换循环”(不要介意原型附件,它只是一个测试)

String.prototype.loopReplace = function(replacee,replacer){
  var result = this;
  while(!!~(result = result.replace('.',' ')).indexOf('.')){}
  return result;
}

在测试的浏览器中,预先创建的 RegExp 胜过其他浏览器,这是有充分理由的:

  • 由于 RegExp 始终是相同的,因此缓存它是一个好主意,而不是在现场重新创建相同的对象。

  • -循环很慢可能是因为重复和操作indexOf每次运行时都会创建一个新字符串,这可能是原因。replaceindexOfreplacereplace

  • split-join很慢可能是因为浏览器必须先创建一个数组,然后是一个字符串,然后再丢弃该数组。尽管浏览器可能已经优化了数组创建,但它仍然较慢。

于 2013-05-05T00:26:10.243 回答