[英]Is javascript string.replace linear?
是javascript的string.replace線性替換,還是有一些時髦的優化?? 基本上,我的問題是,該代碼的結果將在數字上連續嗎?
var index = 0;
html = html.replace(/replaceIndex/g, function (match, capture) {
return index++;
});
我覺得這個問題的答案將是“取決於x”,其中x是Firefox,chrome,v8,rhino等。
除了有人給您提供了指向ES規范的鏈接外,這是一個簡單的測試,您可以嘗試一下。
如果您嘗試在Chrome DevTools,Firebug或IE F12中遵循以下代碼,則您將看到0
連續3次,並且匹配項按順序排列。
var r = /\d/g;
'a1b2c3d'.replace(r, function(m) {
console.log(r.lastIndex, m);
});
// 0 "1"
// 0 "2"
// 0 "3"
這意味着:
ES5似乎沒有指定調用的順序:
對於每個匹配的子字符串,請使用以下m + 3個參數調用該函數。
但是,ES6可以。 String.prototype.replace
使用RegExp.prototype[@@replace]
(恢復),其行為類似於
21.2.5.8 RegExp.prototype [@@ replace](字符串,replaceValue)
- 令S為ToString( string )。
- 讓結果成為一個新的空列表。
- 重復
- 令結果為RegExpExec( rx , S )。
- 將結果追加到結果末尾。
- 令cumulativeResult為空的String值。
- 令nextSourcePosition為0。
- 重復,每個結果的結果 ,
- 假設position為ToInteger(Get( result ,
"index"
))。- 設position為max(min( position , lengthS ),0)。
- 假設replValue為Call( replaceValue , undefined , replacerArgs )。
- 讓替換為ToString( replValue )。
- 如果position≥nextSourcePosition ,則
- 注意位置通常不應向后移動。 如果是這樣,則表明RegExp子類行為異常,或者使用訪問觸發的副作用來更改rx的全局標志或其他特征。 在這種情況下,將忽略相應的替換。
- 讓accumulatedResult是通過與來自nextSourcePosition(含)到位置 (不包括),並與替換的代碼單元包括所述代碼單元的S的子串級聯accumulatedResult的電流值的代碼單元構成的字符串。
- 令nextSourcePosition為position + matchLength 。
- 如果nextSourcePosition≥ 長度 ,返回accumulatedResult。
- 返回通過將累計結果的代碼單元與S的子字符串連接而形成的String,該子字符串由從nextSourcePosition (包括)到最后的S (包括)的代碼單元組成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.