什么是替换性能秘密?[HTML转义]

Sar*_*ram 10 javascript performance

我花了一些时间寻找最好的方法来逃避html字符串并找到一些讨论:讨论1 讨论2.它引导我替换所有功能.然后我做了性能测试,并试图找到实现类似速度的解决方案,但没有成功:(

这是我的最终测试用例集.我在网上找到它并随着我的尝试扩展(底部有4个案例)但仍无法达到replaceAll()性能.

什么是秘密女巫使replaceAll()解决方案如此迅速?

映入眼帘!

代码片段:

String.prototype.replaceAll = function(str1, str2, ignore) 
{
   return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"):str2);
};
Run Code Online (Sandbox Code Playgroud)

qwerty的学分

迄今为止最快的案例:

html.replaceAll('&', '&amp;').replaceAll('"', '&quot;').replaceAll("'", '&#39;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');
Run Code Online (Sandbox Code Playgroud)

Sar*_*ram 4

终于我找到了!感谢Jack向我指出 jsperf 的具体内容

我应该注意到测试结果很奇怪;当 .replaceAll() 在 Benchmark.prototype.setup 中定义时,其运行速度是全局定义(即在标签内)时的两倍。我仍然不确定为什么会这样,但这肯定与 jsperf 本身的工作原理有关。

答案是:

replaceAll- 这达到了jsperf限制/错误,由特殊序列引起"\\$&",所以结果是错误的。

compile()- 当不带参数调用时,它将 regexp 定义更改为/(?:). 我不知道这是错误还是什么,但调用后性能结果很糟糕。

这是我的安全测试结果

最后我准备了适当的测试用例

结果是,对于 HTML 转义,最好的方法是使用基于本机 DOM 的解决方案,例如:

document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML
Run Code Online (Sandbox Code Playgroud)

或者,如果您重复多次,您可以使用准备好的变量来完成:

//prepare variables
var DOMtext = document.createTextNode("test");
var DOMnative = document.createElement("span");
DOMnative.appendChild(DOMtext);

//main work for each case
function HTMLescape(html){
  DOMtext.nodeValue = html;
  return DOMnative.innerHTML
}
Run Code Online (Sandbox Code Playgroud)

感谢大家的合作以及发表评论和指导。

jsperf 错误描述

String.prototype.replaceAll定义如下:

function (str1, str2, ignore) {
  return this.replace(new RegExp(str1.replace(repAll, "\\#{setup}"), (ignore ? "gi" : "g")), (typeof(str2) == "string") ? str2.replace(/\$/g, "$$") : str2);
}
Run Code Online (Sandbox Code Playgroud)