Sagt wer?
Naja, vielleicht nicht ganz, aber es heißt hier u.A.: "Seit der JavaScript-Version 1.5 gilt das Auslesen der Treffer geklammerten Ausdrücke über RegExp.$1, RegExp.$2 und so weiter als veraltet."
Das ist aber etwas deutlich anderes als "nicht mehr unterstützt". Es wird definitiv noch unterstützt, man sollte es aber vielleicht nicht mehr verwenden.
Das wird die Probleme 2 und 3 nicht lösen.
Wieso nicht? Es macht genau das was gefordert war: Es durchläuft das Array a mit den Ersetzungswerten und ersetzt im String s alle Vorkommen von a+Arrayindex (also a0 bis a99, wenn a entsprechend lang ist) durch den entsprechenden Ersetzungswert.
Das tut es nicht.
(1) Gefordert war a0 bis a99, nicht a0 bis a+Arraylänge
(2) Was passiert bei s="a10"? Erst nachdenken, dann posten! Oder weiterlesen:
s.replace(/a1/gi,a[1]) schägt zu und ersetzt die ersten zwei Zeichen von s durch den Wert von a[1].
s.replace(/a10/gi,a[10]) wird erst danach ausgeführt und findet in s kein "a10" mehr, es sei denn, der Wert von a[1] ist zufällig "a1", "a10", "a10foobar" oder "a10 Mir doch egal!". Ist a[1] aber z.B. "foobar", ist s nach dem replace(/a1/gi,a[1]) "foobar0". Und richtig übel wird es, wenn a[1] den String "a10" enthält, z.B. den Wert "ich mag a10 nicht" hat. Dann wird nämlich in der Ersetzung noch mal ersetzt. Bei a[10]="Unsinn" und s="a10" entsteht also nicht "Unsinn", sondern "ich mag Unsinn nicht".
Problem 1 nicht wie spezifiziert gelöst, Problem 2 nicht gelöst, Problem 3 nicht gelöst.
Alexander