javaScript中的String的、拼接:

与其他语言类似、ECMAScript的字符串是不可变的、即它们的值不能改变。考虑下面的代码:

 
  
  1. var str = "hello";   
  2. str += "world";   
实际上,这段代码在幕后执行的步骤如下:
1、创建存储"hello"的字符串。
2、创建存储"world"的字符串。
3、创建存储连接结果的字符串。
4、把str的当前内容复制到结果中。
5、把"world"复制到结果中。
6、更新str、使它指向结果。
如果重复这一过程次数较多、就会造成性能问题。

解决方法是用Array对象存储字符串、然后用join()方法(参数是空字符串)创建最后的字符串:
 
  
  1. var arr = new Array;   
  2. arr[0] = "hello";   
  3. arr[1] = "world";   
  4. var str = arr.join(""); 

此时、执行步骤如下:
1、创建存储结果的字符串。
2、把每个字符串复制到结果中的合适位置。

更好的解决办法可以使用StringBuffer类打包该功能:

 
  
  1. function StringBuffer(){   
  2.             this._string_ = new Array;   
  3.         }   
  4.         StringBuffer.prototype.append = function(str){   
  5.             this._string_.push(str);   
  6.         };   
  7.         StringBuffer.prototype.toString = function(){   
  8.             return this._string_.join("");   
  9.         };   
  10.            
  11.         /**由于javaScript没有公私(有)属性的区别、这样声明string只是为了标识它本意是私有属性。  
  12.            测试一下StringBuffer对象和传统的字符串连接方法的性能:  
  13.         */   
  14.            
  15.         var d1 = new Date();     
  16.         var str = "";     
  17.            
  18.         for(var i =0 ; i < 10000; i++){   
  19.             str +="性能测试";    
  20.         }   
  21.         var d2 = new Date();   
  22.         document.write("加号连接:<font color='red;'>"+(d2.getTime()-d1.getTime())+"</font> 所用时间");   
  23.            
  24.            
  25.         var oBuffer = new StringBuffer();   
  26.         d1 = new Date();   
  27.         for(var i =0 ; i < 10000; i++){   
  28.             oBuffer.append("性能测试");       
  29.         }   
  30.         var sREsult = oBuffer.toString();     
  31.               
  32.         d2 = new Date();   
  33.         document.write("<br/>StringBuffer连接:<font color='red;'>"+(d2.getTime()-d1.getTime())+"</font> 所用时间");  

IE6测试结果:
 加号连接:2094 所用时间     
 StringBuffer连接:47 所用时间
 结果显而易见、但是如果数据量不是非常大、完全没有必要这样做
 但是用IE8跟360、谷歌这些浏览器测试结果又完全不同
 应该是javaScript对传统的""+""方法进行了优化、
 毕竟这个示例是很老很老的了出自————《javascript高级程序设计》  
 谷歌浏览器测试:
 加号连接:0 所用时间
 StringBuffer连接:2 所用时间
 百度了很久、木有什么好的结果
 看来以后写连接优化还要注意浏览器呀
 不过现在估计用IE6的很少很少了吧!!! 也希望了解情况的大侠看到给解释解释!!!感激不尽!!!

 
  
  1. /**  
  2.          * 查询数组中是否存在某个元素  
  3.          * @param {Object} sValue 元素值   
  4.          * @memberOf {TypeName}   
  5.          * @return {Int} 返回-1则说明不存在、否则返回该元素在数组中的索引值   
  6.          */   
  7.         Array.prototype.indexOfHzw = function (sValue){   
  8.             for(var i=0; i < this.length; i++){   
  9.                 if(sValue == this[i]){   
  10.                     return i ;   
  11.                 }   
  12.             }   
  13.             return -1;   
  14.         }       
  15.         var array = new Array("red","blue","yellow","fuck");   
  16.         alert(array.indexOfHzw("fuck")); 
 
  
  1. <script type="text/javascript">   
  2.        
  3.         /**  
  4.          * 创建新方法  
  5.          */   
  6.         Object.prototype.showValue = function(){   
  7.             alert(this.valueOf());          
  8.         };      
  9.         var str = "hello";   
  10.         var iNum = 26;      
  11.         str.showValue();    
  12.         iNum.showValue();    
  13.            
  14.            
  15.         /**  
  16.          * 从定义已有方法  
  17.          */   
  18.         Function.prototype.toString = function (){   
  19.             return "从定义方法";   
  20.         };   
  21.         function fTry(){   
  22.             alert("Try");   
  23.         }   
  24.         alert(fTry.toString());   
  25.     </script>   

看来prototype很给力!!!