Js下的StringBuilder

搞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[1instanceof 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 */

 

 

posted @ 2010-10-25 10:40  mcjeremy  阅读(8601)  评论(1编辑  收藏  举报
------------------------------------ 心静似高山流水不动,心清若巫峰雾气不沾 ------------------------------------