В соответствии со стандартом ECMA-262 String.prototype.replace вызывает RegExp.prototype [@@ replace] , что говорит:
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).
где rx
есть /.*/g
и S
есть 'asdf'
.
Смотрите 11.c.iii.2.b:
б. Пусть nextIndex будет AdvanceStringIndex (S, thisIndex, fullUnicode).
Поэтому в 'asdf'.replace(/.*/g, 'x')
нем на самом деле:
- результат (не определено), результаты =
[]
, lastIndex =0
- результат =
'asdf'
, результаты = [ 'asdf' ]
, lastIndex =4
- Результат =
''
, = результаты [ 'asdf', '' ]
, LastIndex = 4
, AdvanceStringIndex
установите LastIndex к5
- результат =
null
, результаты = [ 'asdf', '' ]
, возврат
Поэтому есть 2 матча.
"asdf".match(/.*/g)
return ["asdf", ""]