搞C#的应该都知道,C#中的StringBuilder效率远远高于String,那在JS中呢?
看看这篇文章的分析:http://www.cnblogs.com/matthew/archive/2008/08/15/1268843.html
通过这篇文章可以看出,在js中也存在同样的问题,
按照这两篇文章:
http://www.cnblogs.com/xeonwell/archive/2007/02/11/stringbuilder_javascript.html
http://www.cnblogs.com/hooyes/archive/2009/12/10/javascript_stringbuilder.html
的处理,我也搞了个js中的StringBuilder来用,在这里记录以来,以便要用的时候好拿:
1 /*
2 模拟 C#中的StringBuilder,提升JS中字符串拼接的效率及性能。
3 Author : Jeremy
4 Date : 2010-10-25
5 */
6
7 //对象定义(构造函数)
8 //参数:所有参数须为字符串形式.
9 //当参数长度为1时,参数值将是字符串之间连接的分隔符
10 //当参数长度大于1时,最后一位将是字符串之间的分隔符,其余的参数将是字符串值
11 //当不指定参数时,分隔符默认为空白
12 //也可以不指定分隔符,而在ToString中显式指定分隔符
13 //如:var str = new StringBuilder(','); 则在ToString时,将使用,号作为分隔符连接字符串
14 // var str = new StringBuilder('a','b','c',','); 则在ToString时,将输出 'a,b,c'
15 function StringBuilder()
16 {
17 this._buffers = [];
18 this._length=0;
19 this._splitChar = arguments.length>0 ? arguments[arguments.length-1] : '';
20
21 if(arguments.length>0)
22 {
23 for(var i=0,iLen=arguments.length-1;i<iLen;i++)
24 {
25 this.Append(arguments[i]);
26 }
27 }
28 }
29
30 //向对象中添加字符串
31 //参数:一个字符串值
32 StringBuilder.prototype.Append=function(str)
33 {
34 this._length += str.length;
35 this._buffers[this._buffers.length] = str;
36 }
37 StringBuilder.prototype.Add = StringBuilder.prototype.append;
38
39 //向对象附加格式化的字符串
40 //参数:参数一是预格式化的字符串,如:'{0} {1} {2}'
41 //格式参数可以是数组,或对应长度的arguments,
42 //参见示例
43 StringBuilder.prototype.AppendFormat=function()
44 {
45 if(arguments.length>1)
46 {
47 var TString=arguments[0];
48 if(arguments[1] instanceof Array)
49 {
50 for(var i=0,iLen=arguments[1].length;i<iLen;i++)
51 {
52 var jIndex=i;
53 var re=eval("/\\{"+jIndex+"\\}/g;");
54 TString= TString.replace(re,arguments[1][i]);
55 }
56 }
57 else
58 {
59 for(var i=1,iLen=arguments.length;i<iLen;i++)
60 {
61 var jIndex=i-1;
62 var re=eval("/\\{"+jIndex+"\\}/g;");
63 TString= TString.replace(re,arguments[i]);
64 }
65 }
66 this.Append(TString);
67 }
68 else if(arguments.length==1)
69 {
70 this.Append(arguments[0]);
71 }
72 }
73
74 //字符串长度(相当于ToString()后输出的字符串长度
75 StringBuilder.prototype.Length=function()
76 {
77 if(this._splitChar.length>0 && (!this.IsEmpty()))
78 {
79 return this._length + ( this._splitChar.length * ( this._buffers.length-1 ) ) ;
80 }
81 else
82 {
83 return this._length;
84 }
85 }
86 //字符串是否为空
87 StringBuilder.prototype.IsEmpty=function()
88 {
89 return this._buffers.length <= 0;
90 }
91 //清空
92 StringBuilder.prototype.Clear = function()
93 {
94 this._buffers = [];
95 this._length=0;
96 }
97 //输出
98 //参数:可以指定一个字符串(或单个字符),作为字符串拼接的分隔符
99 StringBuilder.prototype.ToString = function()
100 {
101 if(arguments.length==1)
102 {
103 return this._buffers.join(arguments[1]);
104 }
105 else
106 {
107 return this._buffers.join(this._splitChar);
108 }
109 }
110
111 //示例:
112 /*
113 var sb = new StringBuilder('&&'); //指定&&为分隔符
114 alert(sb.Length());
115 sb.Append('hEllo');
116 sb.Append('wORLD');
117 alert(sb.ToString()); //将输出 hEllo&&wORLD
118 sb.Clear();
119 sb.AppendFormat("Hello! {0} {1} {2}",['a','b','c']);
120 sb.AppendFormat("Today is {0}",['周一']);
121 alert(sb.ToString()); //将输出 Hello! a b c&&Today is 周一
122 sb.Clear();
123 sb.AppendFormat("Hello! {0} {1} {2}",'a','b','c');
124 sb.Append('World');
125 alert(sb.ToString('__')); //将输出 Hello! a b c__World
126 */
2 模拟 C#中的StringBuilder,提升JS中字符串拼接的效率及性能。
3 Author : Jeremy
4 Date : 2010-10-25
5 */
6
7 //对象定义(构造函数)
8 //参数:所有参数须为字符串形式.
9 //当参数长度为1时,参数值将是字符串之间连接的分隔符
10 //当参数长度大于1时,最后一位将是字符串之间的分隔符,其余的参数将是字符串值
11 //当不指定参数时,分隔符默认为空白
12 //也可以不指定分隔符,而在ToString中显式指定分隔符
13 //如:var str = new StringBuilder(','); 则在ToString时,将使用,号作为分隔符连接字符串
14 // var str = new StringBuilder('a','b','c',','); 则在ToString时,将输出 'a,b,c'
15 function StringBuilder()
16 {
17 this._buffers = [];
18 this._length=0;
19 this._splitChar = arguments.length>0 ? arguments[arguments.length-1] : '';
20
21 if(arguments.length>0)
22 {
23 for(var i=0,iLen=arguments.length-1;i<iLen;i++)
24 {
25 this.Append(arguments[i]);
26 }
27 }
28 }
29
30 //向对象中添加字符串
31 //参数:一个字符串值
32 StringBuilder.prototype.Append=function(str)
33 {
34 this._length += str.length;
35 this._buffers[this._buffers.length] = str;
36 }
37 StringBuilder.prototype.Add = StringBuilder.prototype.append;
38
39 //向对象附加格式化的字符串
40 //参数:参数一是预格式化的字符串,如:'{0} {1} {2}'
41 //格式参数可以是数组,或对应长度的arguments,
42 //参见示例
43 StringBuilder.prototype.AppendFormat=function()
44 {
45 if(arguments.length>1)
46 {
47 var TString=arguments[0];
48 if(arguments[1] instanceof Array)
49 {
50 for(var i=0,iLen=arguments[1].length;i<iLen;i++)
51 {
52 var jIndex=i;
53 var re=eval("/\\{"+jIndex+"\\}/g;");
54 TString= TString.replace(re,arguments[1][i]);
55 }
56 }
57 else
58 {
59 for(var i=1,iLen=arguments.length;i<iLen;i++)
60 {
61 var jIndex=i-1;
62 var re=eval("/\\{"+jIndex+"\\}/g;");
63 TString= TString.replace(re,arguments[i]);
64 }
65 }
66 this.Append(TString);
67 }
68 else if(arguments.length==1)
69 {
70 this.Append(arguments[0]);
71 }
72 }
73
74 //字符串长度(相当于ToString()后输出的字符串长度
75 StringBuilder.prototype.Length=function()
76 {
77 if(this._splitChar.length>0 && (!this.IsEmpty()))
78 {
79 return this._length + ( this._splitChar.length * ( this._buffers.length-1 ) ) ;
80 }
81 else
82 {
83 return this._length;
84 }
85 }
86 //字符串是否为空
87 StringBuilder.prototype.IsEmpty=function()
88 {
89 return this._buffers.length <= 0;
90 }
91 //清空
92 StringBuilder.prototype.Clear = function()
93 {
94 this._buffers = [];
95 this._length=0;
96 }
97 //输出
98 //参数:可以指定一个字符串(或单个字符),作为字符串拼接的分隔符
99 StringBuilder.prototype.ToString = function()
100 {
101 if(arguments.length==1)
102 {
103 return this._buffers.join(arguments[1]);
104 }
105 else
106 {
107 return this._buffers.join(this._splitChar);
108 }
109 }
110
111 //示例:
112 /*
113 var sb = new StringBuilder('&&'); //指定&&为分隔符
114 alert(sb.Length());
115 sb.Append('hEllo');
116 sb.Append('wORLD');
117 alert(sb.ToString()); //将输出 hEllo&&wORLD
118 sb.Clear();
119 sb.AppendFormat("Hello! {0} {1} {2}",['a','b','c']);
120 sb.AppendFormat("Today is {0}",['周一']);
121 alert(sb.ToString()); //将输出 Hello! a b c&&Today is 周一
122 sb.Clear();
123 sb.AppendFormat("Hello! {0} {1} {2}",'a','b','c');
124 sb.Append('World');
125 alert(sb.ToString('__')); //将输出 Hello! a b c__World
126 */