讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議35:獲取字節長度 >

建議35:獲取字節長度

String對象的length屬性能夠返回字符串的長度,不管字符是單字節,還是雙字節,都作為一個來計算。因此,要獲取字符串的字節長度,必須通過手工計算獲取,這裡介紹兩種方法。

1)第一種方法是利用循環結構枚舉每個字符,並根據字符的字符編碼,判斷當前字符是單字節還是雙字節,然後遞加字符串的字節數。


String.prototype.lengthB=function{

var b=0,l=this.length;

if(l){

for(var i=0;i<l;i++){

if(this.charCodeAt(i)>255){

b+=2;

}else{

b++;

}

}

return b;

}else{

return 0;

}

}

var s="String對像長度";

alert(s.lengthB);//14


在檢測字符是否為雙字節或單字節時,方法也有多種,這裡提供兩種思路(代碼如下):


for(var i=0;i<l;i++){

var c=this.charAt(i);

if(escape(c).length>4){

b+=2;

}else if(c!="\r"){

b++;

}

}


或者使用正則表達式進行字符編碼驗證:


for(var i=0;i<l;i++){

var c=this.charAt(i);

if(/^[\u0000-\u00ff]$/.test(c)){

b++;

}else{

b+=2;

}

}


2)第二種方法是利用正則表達式把字符串中雙字節字符臨時替換為兩個字符,然後調用length屬性獲取臨時字符串的長度。


String.prototype.lengthB=function{

var s=this.replace(/[^\x00-\xff]/g,"**");

return s.length;

}


這種方法比較簡潔,但執行速度相對較慢,因為需要兩次遍歷字符串,即調用replace方法時一次,使用length屬性時一次。而第一種方法只進行一次字符串遍歷。

提示:String對象的length屬性是只讀屬性,這與Array的length屬性不同。不過,與數組相同,字符串可以使用下標來定位單個字符在字符串中的位置,其中第一個字符的下標值為0,最後一個字符的下標值為length-1。字符串中的字符是不能夠被for in循環枚舉的。運算符delete也不能刪除字符串中指定位置的字符。