幾乎所有的js都與字串操作緊密相連。典型的就是ajax從伺服器獲取字串將這些字串轉換成更容易的js物件,然後從資料中生成html字串。包含合併,分解,重新排列,搜尋,遍歷,以及其他方法處理字串。
1.plus (+) and plus-equals (+=) operators 加或加等於操作
str += "one" + "two";
上面發生的步驟:
記憶體中建立了乙個臨時字串
臨時字串被賦值於「onetwo」
臨時字串與str的值進行鏈結
結果賦值為str
str += "one";
str += "two";
但這個鏈結避免了臨時字串的建立速度更快。
str = str + "one" + "two"; 合併多個短字串比鏈結乙個大字串更快(避免多次拷貝那些大字串) 這個表示式拷貝了2次str 合併了2次 比 str = "one" + "two"; 而這個表示式 建立了臨時字串和2次拷貝大字串 效能衝擊要輕得多。
firefox 和編譯期合併:firefox所有的字串都屬於編譯期常量 firefox自動在編譯過程中合併他們。這樣速度更快。
array.prototype.join 陣列鏈結字串
上面的** 可以用陣列鏈結改進
string.prototype.concat 字串原有屬性追加字串
但是concat 屬性比+和+=速度要慢
正規表示式:
一 工作原理:當你建立乙個正規表示式物件後(使用正規表示式直接量或regexp構造器)瀏覽器會檢測有沒有模版錯誤,然後轉換為本機**列程 用於執行匹配工作
二 設定起始位置: 確定目標字串的搜尋開始位置 是字串的開始位置還是指定的開始位置。或嘗試失敗後將最後嘗試的位置推後乙個位置進行搜尋。在這個階段各個瀏覽器廠商優化正規表示式引擎 主要跳過沒有必要的步驟。
三 匹配每個正規表示式的字元:乙個乙個掃瞄文字和匹配模版 失敗後回溯到掃瞄之前的位置上。
四 匹配成功或失敗
分支和回溯:
重複和回溯:
var str = "para 1.
" +"
"para 2.
" +"div.
";/.*/i.test(str);
*是貪婪量詞 可以改用非貪婪量詞 *?嘗試的匹配的過程不同
回溯失控:
/[\s\s]*?[\s\s]*?[\s\s]*?[\s\s]*?
[\s\s]*?[\s\s]*?[\s\s]*?/
如果目標字串缺少乙個或多個標籤的時候 情況很糟糕
/(?:(?!)[\s\s])*(?:(?!)[\s\s])*
(?:(?!)[\s\s])*(?:(?!)[\s\s])*
(?:(?!)[\s\s])*(?:(?!)[\s\s])*
(?:(?!)[\s\s])*/
這個改進的雖然可以避免回溯失控但是效率非常底下。
使用前瞻和後向引用列舉原子組:
/(?=([\s\s]*?))\1(?=([\s\s]*?))\2(?=([\s\s]*?
))\3(?=([\s\s]*?))\4(?=([\s\s]*?))\5
(?=([\s\s]*?))\6[\s\s]*?/
JavaScript效能問題
首先說明,這裡不是測試string 操作和用stringbuffer進行字串 的效能區別。測試環境為ie6 sp2。下面的測試函式在頁面中沒有包含任何其他指令碼 檔案時的執行時間為15毫秒,而當頁面中引用一些無關的指令碼的檔案時 引用了10多個其他指令碼檔案,都跟這段 無關 執行時間變為400 毫秒...
JavaScript效能優化
盡量使用區域性變數 減少全域性變數的使用 可以縮小查詢的作用域鏈。使用變數和陣列要比訪問物件上的屬性更有效率。對於多重屬性查詢,將多次使用的屬性查詢儲存在區域性變數中。前 window.location.href.substring window.location.href.indexof 後 va...
分析javascript關閉
1.什麼是閉包 1 官方解釋 乙個擁有多個變數和繫結了這些變數的環境的表示式 一般是乙個函式 因而這些變數也是該表示式的一部分。我的理解 所謂的閉包就是連線函式內部和函式外部的一座橋梁。使得在外部也可以訪問到函式內部的變數。2 閉包的特點 a 作為乙個函式變數的乙個引用,當函式返回時,其處於啟用狀態...