在
JavaScript中,您可以在regex字符串替换操作中定义回调处理程序:
str.replace(/str[123]|etc/,replaceCallback);
想象一下,你有一个字符串和替换的查找对象.
var lookup = {"str1": "repl1","str2": "repl2","str3": "repl3","etc": "etc" };
和这个回调函数:
var replaceCallback = function(match) { if (lookup[match]) return lookup[match]; else return match; }
你如何评估上述回调的表现?有什么办法可以改进吗?将
if (match in lookup) //....
甚至
return lookup[match] || match;
导致JS编译器优化的机会,还是一切都一样?
解决方法
1到Annie关于perf基准.
但我会和
return lookup[match] || match;
它不仅仅是对属性的单一检索(而不是 – 禁止优化 – 两个,如您之前的例子),但它也更短,(对于较短的代码并不总是这样). JavaScript编码器它会倾向于给新手一点点,但是你想要教新手的第一件事就是特别(和优秀)||和&&在JavaScript中工作,所以…
在某些实现中,它也可以围绕几个(非常)边缘的情况. (示例:{}中的’toString’应为true [所有对象从Object原型继承toString],但在Microsoft的JScript中为false).
关于优化:除非显而易见(不要让你的循环条件成为一个必须去计数的功能,如果它可以是一个不变的,避免不必要地重复查找),即使没有一般的讨论是否值得担心这个东西之前你看到一个问题(有时被称为“过早优化”),对于一般的Web来说尤其如此.不同的微优化在不同的实现中有不同的结果,有时是冲突的结果(“A”在Internet Explorer中更好,但在FireFox中更糟糕,而且相反).大多数情况下,这是一个等待直到您看到具体问题的问题,然后解决该问题.
我更喜欢简单和清晰,除非我有强烈的理由相信,一些笨蛋会给我一个可衡量的现实世界的改善.