당으로 ECMA-262 표준, String.prototype.replace는 호출 RegExp.prototype [대체 @@] 말한다 :
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
- result =
''
, results = [ 'asdf', '' ]
, lastIndex = 4
,, AdvanceStringIndex
lastIndex를 다음으로 설정하십시오.5
- 결과 =
null
, 결과 = [ 'asdf', '' ]
, 반환
따라서 2 개의 일치 항목이 있습니다.
"asdf".match(/.*/g)
return [ "asdf", ""]