[英]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
將是一個糟糕的選擇,因為:
Uint16Array
會更合適。Uint8Array
/ Uint16Array
需要將其從 JavaScript 的數字類型轉換為 8 位/16 位無符號 integer (以及讀取時的相反),這確實很便宜但不是免費的。 並且大概您必須使用charCodeAt
來獲取要存儲的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.