Sesuai standar ECMA-262 , String.prototype.replace panggilan RegExp.prototype [@@ replace] , yang mengatakan:
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).
dimana rx
adalah /.*/g
dan S
adalah 'asdf'
.
Lihat 11.c.iii.2.b:
b. Biarkan nextIndex menjadi AdvanceStringIndex (S, thisIndex, fullUnicode).
Oleh karena itu dalam 'asdf'.replace(/.*/g, 'x')
dalamnya sebenarnya:
- hasil (tidak ditentukan), hasil =
[]
, lastIndex =0
- hasil =
'asdf'
, hasil =[ 'asdf' ]
, lastIndex =4
- hasil =
''
, hasil = [ 'asdf', '' ]
, lastIndex = 4
,AdvanceStringIndex
, mengatur lastIndex ke5
- hasil =
null
, hasil =[ 'asdf', '' ]
, kembali
Karena itu ada 2 pertandingan.
"asdf".match(/.*/g)
return ["asdf", ""]