あたりとして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を参照してください。
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)
リターン[ "ASDF"、 ""]