终于我找到了!
谢谢Jack https://stackoverflow.com/users/1338292/jack向我指出 jsperf 具体内容
我应该注意到测试结果很奇怪;当 .replaceAll() 为
在 Benchmark.prototype.setup 中定义,它的运行速度是原来的两倍
与全局定义时(即在标签内)相比。
我仍然不确定为什么会这样,但它肯定与
jsperf 本身是如何工作的。
答案是:
replaceAll
- 这达到了 jsperf 限制/错误,由特殊序列引起"\\$&"
,所以结果是错误的。
compile()
- 当不带参数调用时,它将正则表达式定义更改为/(?:)
。我不知道这是错误还是什么,但调用后性能结果很糟糕。
这是我的结果安全测试 http://jsperf.com/htmlencoderegex/34.
最后我准备好了正确的测试用例 http://jsperf.com/htmlencoderegex/35.
结果是,对于 HTML 转义,最好的方法是使用基于本机 DOM 的解决方案,例如:
document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML
或者,如果您重复多次,您可以使用准备好的变量来完成:
//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
}
感谢大家的合作以及发表评论和指导。
jsperf 错误描述
The 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);
}