Gereğince ECMA-262 standardı, String.prototype.replace çağırır RegExp.prototype [yerine @@] söyler:
11. Repeat, while done is false
a. Let result be ? RegExpExec(rx, S).
b. If result is null, set done to true.
c. Else result is not null,
i. Append result to the end of results.
ii. If global is false, set done to true.
iii. Else,
1. Let matchStr be ? ToString(? Get(result, "0")).
2. If matchStr is the empty String, then
a. Let thisIndex be ? ToLength(? Get(rx, "lastIndex")).
b. Let nextIndex be AdvanceStringIndex(S, thisIndex, fullUnicode).
c. Perform ? Set(rx, "lastIndex", nextIndex, true).
nerede rx
olduğunu /.*/g
ve S
bir 'asdf'
.
Bkz. 11.c.iii.2.b:
b. NextIndex, AdvanceStringIndex (S, thisIndex, fullUnicode) olsun.
Bu nedenle 'asdf'.replace(/.*/g, 'x')
aslında:
- sonuç (tanımsız), sonuç =
[]
, lastIndex =0
- sonuç =
'asdf'
, sonuçlar = [ 'asdf' ]
, lastIndex =4
- sonuç =
''
, sonuçlar = [ 'asdf', '' ]
, lastIndex = 4
,, AdvanceStringIndex
lastIndex öğesini5
- sonuç =
null
, sonuçlar = [ 'asdf', '' ]
, döndür
Bu nedenle 2 maç var.
"asdf".match(/.*/g)
return ["asdf", ""]