1. 大型字符串拼接
使用数组的join方法确实是最好的实现,可以根据这个思路设计StringBuilder, StringBuffer类。

2. 大型字符串trim
I

  1. String.prototype.trim = function(){
  2. return this.replace(/(^\s+)(\s+$)/g, '');
  3. };

为了避免正则表达式使用括号带来的消耗,可以写成这样,II

  1. String.prototype.trim = function(){
  2. return this.replace(/(?:^\s+)(?:\s+$)/g, '');
  3. };

另外有一套实现是这样的,III

  1. String.prototype.lTrim = function(){
  2. return this.replace(/^\s+/, '');
  3. };
  4. String.prototype.rTrim = function(){
  5. return this.replace(/\s+$/, '');
  6. };
  7. String.prototype.trim = function(){
  8. return this.lTrim().rTrim();
  9. };


3. 大型字符串字节长度
即双字节长度为2。注意:这个提法其实也不正确,Javascript是使用Unicode字符集的,所有的字符都(有可能)是双字节字符。将汉字等转换为双字节长度主要是为了某些应用。
最土的方法还是循环遍历所有字符,I

  1. String.prototype.bytes = function(){
  2. var l=this.length, r=l, n=0xff;
  3. for(var i=l; i>=0; i--){
  4. if(this.charCodeAt(i)>n){
  5. r++;
  6. }
  7. }
  8. return r;
  9. };

这里判断字符是否双字节有很多方法,效率较高的之间相差(大概)不大。

另一种实现则看起来很轻灵,寥寥几行,II

  1. String.prototype.bytes = function(){
  2. return this.replace(/[^\x00-\xff]/g,"xx").length;
  3. };

多动脑子,则想法愈多(也常把简单的事情复杂化),我想如果可以快速取得表达式(双字节/单字节)匹配次数,两值相加应该比较高效,III

  1. String.prototype.bytes = function(){
  2. return this.length+this.replace(/[\x00-\xff]/g,"").length;

};
IV

  1. String.prototype.bytes = function(){
  2. return this.length+(this.match(/[^\x00-\xff]/g)"").length;

};

bytes方法的效率:使用Javascript脚本循环大型字符串(I),确实远不如内置的replace方法(II)快,而使用正则表达式match方法(IV)又比replace方法(III)稍快,排名第二。

总结:
1. replace方法因匹配而被替换的子串愈长,效率愈低。
2. 根据目标字符串,选择合适的实现。