Según el estándar ECMA-262 , String.prototype.replace llama a RegExp.prototype [@@ replace] , que dice:
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).
donde rx
es /.*/g
y S
es 'asdf'
.
Ver 11.c.iii.2.b:
si. Deje que nextIndex sea AdvanceStringIndex (S, thisIndex, fullUnicode).
Por 'asdf'.replace(/.*/g, 'x')
lo tanto, en realidad es:
- resultado (indefinido), resultados =
[]
, lastIndex =0
- resultado =
'asdf'
, resultados = [ 'asdf' ]
, lastIndex =4
- resultado =
''
, resultados = [ 'asdf', '' ]
, lastIndex = 4
, AdvanceStringIndex
, establecen lastIndex a5
- resultado =
null
, resultados = [ 'asdf', '' ]
, retorno
Por lo tanto hay 2 partidos.
"asdf".match(/.*/g)
return ["asdf", ""]