簡體   English   中英

如何有效地操作 Javascript 中的字符串?

[英]How to efficiently manipulate strings in Javascript?

如何有效地更改 Javascript 中的字符串,而無需每次更改時都創建新字符串? 附加的代碼說明了這一點,因為每個“結果+=”操作都會生成一個新字符串。

使用 Unit8Array 作為工作區的想法似乎失敗了,因為轉換為字符串同樣低效。

; Use mask to change characters in string to a
; '-' if mask dictates that. 
function maskOutput(input, mask) {
 let result = '';
 for (let i=0; i < input.length; i++){
    if (mask.charAt(i) === 'X') {
      result += '-';
    } else {
       result += input.charAt(i);
    }
 }
 return result;
}

我要做的第一件事是檢查臨時字符串是否真的對我的頁面/應用程序造成了問題,因為 JavaScript 引擎非常擅長優化諸如大量臨時字符串之類的常見問題,尤其是在您的maskOutput字符串所在的情況下字符串連接的結果。 (V8,Chrome 和其他地方的引擎,在必要時通過將部分字符串組合到一個鏈表中來實現。)您的maskOutput function 中的字符串連接似乎不太可能成為您的頁面/應用程序的瓶頸。 過去是相當標准的做法,您會看到代碼通過使用數組構建一個大字符串,然后在最后使用.join("") ,因為它在 2009 年左右更快,但是 JavaScript 引擎從那時起已經發展了很多然后我記得幾年前在字符串上使用+=變得更快了。

如果有一些用例(內存壓力,無論如何)臨時字符串是一個問題,您可以使用單個字符的普通數組¹,如果需要(不是您的情況)一開始就轉換一次(從字符串到數組)並且最后(從數組到字符串)。 但是對於像我想象的maskOutput句柄這樣的短字符串,正如你所說,開銷是不值得的。

但只是為了完整性:

function maskOutput(input, mask) {
    const len = input.length;
    let result = Array(len); // Some engines actually do optimize this
    for (let i = 0; i < len; i++) {
        if (mask[i] === 'X') { // No need for a method call
            result[i] = "-";
        } else {
            result[i] = input[i];
        }
    }
    return result.join("");
}

¹ Uint8Array將是一個糟糕的選擇,因為:

  • 字符串由 16 位值(UTF-16代碼單元)組成。 如果要使用類型化數組, Uint16Array會更合適。
  • 將值放入Uint8Array / Uint16Array需要將其從 JavaScript 的數字類型轉換為 8 位/16 位無符號 integer (以及讀取時的相反),這確實很便宜但不是免費的。 並且大概您必須使用charCodeAt來獲取要存儲的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM