1. 大型字符串拼接
使用数组的join方法确实是最好的实现,可以根据这个思路设计StringBuilder, StringBuffer类。
2. 大型字符串trim
I:
- String.prototype.trim = function(){
- return this.replace(/(^\s+)(\s+$)/g, '');
- };
为了避免正则表达式使用括号带来的消耗,可以写成这样,II:
- String.prototype.trim = function(){
- return this.replace(/(?:^\s+)(?:\s+$)/g, '');
- };
另外有一套实现是这样的,III:
- String.prototype.lTrim = function(){
- return this.replace(/^\s+/, '');
- };
- String.prototype.rTrim = function(){
- return this.replace(/\s+$/, '');
- };
- String.prototype.trim = function(){
- return this.lTrim().rTrim();
- };
3. 大型字符串字节长度
即双字节长度为2。注意:这个提法其实也不正确,Javascript是使用Unicode字符集的,所有的字符都(有可能)是双字节字符。将汉字等转换为双字节长度主要是为了某些应用。
最土的方法还是循环遍历所有字符,I:
- String.prototype.bytes = function(){
- var l=this.length, r=l, n=0xff;
- for(var i=l; i>=0; i--){
- if(this.charCodeAt(i)>n){
- r++;
- }
- }
- return r;
- };
这里判断字符是否双字节有很多方法,效率较高的之间相差(大概)不大。
另一种实现则看起来很轻灵,寥寥几行,II:
- String.prototype.bytes = function(){
- return this.replace(/[^\x00-\xff]/g,"xx").length;
- };
多动脑子,则想法愈多(也常把简单的事情复杂化),我想如果可以快速取得表达式(双字节/单字节)匹配次数,两值相加应该比较高效,III:
- String.prototype.bytes = function(){
- return this.length+this.replace(/[\x00-\xff]/g,"").length;
};
IV:
- String.prototype.bytes = function(){
- return this.length+(this.match(/[^\x00-\xff]/g)"").length;
};
bytes方法的效率:使用Javascript脚本循环大型字符串(I),确实远不如内置的replace方法(II)快,而使用正则表达式match方法(IV)又比replace方法(III)稍快,排名第二。
总结:
1. replace方法因匹配而被替换的子串愈长,效率愈低。
2. 根据目标字符串,选择合适的实现。
