搞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 */