/**
* 连接两个正则表达式。
* 题外话:获得字符串常量""的长度,比构建空数组再求其长度效率高(忽略构建过程,求长度消耗时间相同)。
* @param {RegExp} r 指定被连接的正则表达式对象。
* @param {String} p 连接后的表达式使用的选项,由"i","g","m"组合而成。
* @return {RegExp} 返回连接后的正则表达式。
*/
RegExp.prototype.concat = function(r, p){
var i=(this.source.match(/\((?!\?:)/g) || "").length; // 正向预搜索。
return new RegExp(this.source+r.source.replace(/\\(\d)/g, function($0, $1){
return "\\" + (i+($1 | 0)); // 修正第二个表达式中的反向引用。注意这里的位运算。
}), p);
};
3. 修正反向引用时用的位运算(),这里将匹配到的数值字符串与0位或没有其他意义,只是将数值字符串转型为数值,相当于parseInt()函数。
一万次循环叠加可以发现构建空字符串比构建空数组求长度快1到3倍。var I = 10000;
var d = new Date();
for (var i=0; i<I; i++){
"".length;
}
d = new Date()-d;
var d2 = new Date();
for (var i=0; i<I; i++){
[].length;
}
d2 = new Date()-d2;document.write(d+":"+d2);
再将代码改为:代码III
可以发现,求空字符串长度与空数组长度的过程效率相当。可见,代码II处空数组效率多余的消耗主要在构建空数组对象上。var I = 10000;
var s="";
var d = new Date();
for (var i=0; i<I; i++){
s.length;
}
d = new Date()-d;var a=[];
var d2 = new Date();
for (var i=0; i<I; i++){
a.length;
}
d2 = new Date()-d2;document.write(d+":"+d2);