String and String Object

JavaScript 中,基本的資料型態有數值、字串、布林三種,而這些資料的指派都有兩種方法,一種是直接指派值,另一種是用建構函式,以字串為例:

var sv = "1234567890";
var so = new String("1234567890");

以前我一直以為兩種是等價的,不過在看 Efficient JavaScript 這篇文章時才發現兩者不是完全相等,在使用字串的 method 如 .charAt() 時,第一種字串值要先轉換成第二字串物件,然後才執行 .charAt() ,當需要大量執行字串的 method 時,用第二個方法來宣告字串變數理論上會比較快,不過我實際測試之後才注意到文章該段最後有說到這是 Opera 才有特別做最佳化的,測試用的code如下:

var s = "1234567890";
//var s = new String("1234567890");

var start = (new Date()).getTime();
for( var j = 0; j < 10000; j++ ) {
  for( var i = 0; i < s.length; i++ ) {
    s.charAt(i);
  }
}
var end = (new Date()).getTime();
alert(end-start);

結果如下:

Opera Firefox IE
"blah" 234 313 344
new String() 156 381 266
unit: micro seconds

可以發現 Opera 用 new String() 時有比較快, IE 雖然也有,不過我在某些電腦上測試結果是和 Firefox 差不多,沒列出來的 safari 其實表現也和 Firefox 差不多,至於 Google Chrome 在編譯的時候有最佳化過,結果都是超快,無法作為參考。所以結論是,還是繼續用普通的方法就好了XD。