簡體   English   中英

javascript string.replace是線性的嗎?

[英]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"

這意味着:

  1. RE匹配實際上是在調用replace函數之前完成的。
  2. 比賽順序一一替換。

ES5似乎沒有指定調用的順序:

對於每個匹配的子字符串,請使用以下m + 3個參數調用該函數。

但是,ES6可以。 String.prototype.replace使用RegExp.prototype[@@replace] (恢復),其行為類似於

21.2.5.8 RegExp.prototype [@@ replace](字符串,replaceValue)

  • S為ToString( string )。
  • 結果成為一個新的空列表。
  • 重復
    • 結果為RegExpExec( rxS )。
    • 結果追加到結果末尾。
  • cumulativeResult為空的String值。
  • nextSourcePosition為0。
  • 重復,每個結果結果
    • 假設position為ToInteger(Get( result"index" ))。
    • position為max(min( positionlengthS ),0)。
    • 假設replValue為Call( replaceValueundefinedreplacerArgs )。
    • 替換為ToString( replValue )。
    • 如果position≥nextSourcePosition ,則
      • 注意位置通常不應向后移動。 如果是這樣,則表明RegExp子類行為異常,或者使用訪問觸發的副作用來更改rx的全局標志或其他特征。 在這種情況下,將忽略相應的替換。
      • accumulatedResult是通過與來自nextSourcePosition(含)到位置 (不包括),並與替換的代碼單元包括所述代碼單元的S的子串級聯accumulatedResult的電流值的代碼單元構成的字符串。
      • nextSourcePositionposition + matchLength
  • 如果nextSourcePosition≥ 長度 ,返回accumulatedResult。
  • 返回通過將累計結果的代碼單元與S的子字符串連接而形成的String,該子字符串由從nextSourcePosition (包括)到最后的S (包括)的代碼單元組成。

暫無
暫無

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

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