一个问题:
我想处理一个字符串 ( str
),以便将任何带括号的数字(由 匹配rgx
)替换为从数组 ( sub
) 中的适当位置获取的值:
var rgx = /\((\d+)\)/,
str = "this (0) a (1) sentence",
sub = [
"is",
"test"
],
result;
给定上面声明的result
变量,应该是“这是一个测试句”。
两种解决方案:
这有效:
var mch,
parsed = '',
remainder = str;
while (mch = rgx.exec(remainder)) { // Not JSLint approved.
parsed += remainder.substring(0, mch.index) + sub[mch[1]];
remainder = remainder.substring(mch.index + mch[0].length);
}
result = (parsed) ? parsed + remainder : str;
但我认为下面的代码会更快。它的变量更少,更简洁,并使用匿名函数表达式(或lambda):
result = str.replace(rgx, function() {
return sub[arguments[1]];
});
这也有效,但我对速度的看法是错误的; 在 Chrome 中,速度慢得令人惊讶(~50%,我上次检查时)!
...
三个问题:
- 为什么这个过程在 Chrome 中看起来更慢,而在 Firefox 中(例如)更快?
- 与给定更大字符串或数组
replace()
的循环相比,该方法是否有可能更快?while()
如果不是,它在Code Golf之外有什么好处? - 有没有办法优化这个过程,让它像第二种功能方法一样更高效、更轻松?
我欢迎任何关于这些过程背后发生了什么的见解。
...
[ Fo(u)r 记录:我很高兴在我使用“lambda”和/或“功能”这两个词时被点名。我仍在学习这些概念,所以不要假设我确切地知道我在说什么,如果我在这里误用了这些术语,请随时纠正我。]