在《
JavaScript代码优化一例(文)》中,曾经引入了高效构造字符串的StringBuilder对象。不过,那里的StringBuilder比较简单,只有append()一个方法,下面给出经过修改的版本,新版本除增强了append()方法之外,还给出了类似C#中StringBuilder对象的appendFormat方法。
//
// StringBuilder
function StringBuilder()
{
this._strings = new Array();
}
// StringBuilder
function StringBuilder()
{
this._strings = new Array();
}
// enhanced append method
// append(arg1, arg2, ..., argN)
StringBuilder.prototype.append = function (str)
{
var aLen = arguments.length;
for (var i = 0; i < aLen; i++)
{
this._strings.push(arguments[i]);
}
};
StringBuilder.prototype.append = function (str)
{
var aLen = arguments.length;
for (var i = 0; i < aLen; i++)
{
this._strings.push(arguments[i]);
}
};
// like AppendFormat() method of C# StringBuilder object
// appendFormat(fmt, arg1, arg2, ..., argN)
StringBuilder.prototype.appendFormat = function (fmt)
{
var re = /{[0-9]+}/g;
var aryMatch = fmt.match(re);
var aLen = aryMatch.length;
StringBuilder.prototype.appendFormat = function (fmt)
{
var re = /{[0-9]+}/g;
var aryMatch = fmt.match(re);
var aLen = aryMatch.length;
for (var i = 0; i < aLen; i++)
{
fmt = fmt.replace(aryMatch[i], arguments[parseInt(aryMatch[i].replace(/[{}]/g, "")) + 1]);
}
{
fmt = fmt.replace(aryMatch[i], arguments[parseInt(aryMatch[i].replace(/[{}]/g, "")) + 1]);
}
this._strings.push(fmt);
};
};
StringBuilder.prototype.toString = function ()
{
return this._strings.join("");
};
示例1:
var sXML = new StringBuilder();
sXML.append("<myData>/r/n");
sXML.append("<name>", name, "</name>/r/n");
sXML.append("<color>", color, "</color>/r/n");
sXML.append("</myData>/r/n");
alert(sXML.toString());
示例2:
var sHTML = new StringBuilder();
sHTML.appendFormat("<div style='width:{0}px;height:{1}px;background-color:{2};'>", width, height, bkcolor);
sHTML.appendFormat("<a class='{0}' href='{1}' target='_blank'>{2}</a>", className, url, name);
sHTML.append("</div>");
divObj.innerHTML = sHTML.toString();
由例子可以看出,append()适合于构造简单字符串,appendFormat()适合于构造复杂字符串。
测试结果显示,append()比appendFormat()快40% ~ 60%。