◆ exec ループで空文字マッチする場合無限ループする
◆ 対策してないとユーザ入力の正規表現をそのまま 実行する場合に危険

matchAll はない

JavaScript では matchAll な機能がないです

例えば
{1,2}{2,3}{3,4}

と言うテキストから
[ ["1", "2"], ["2", "3"], ["3", "4"] ]

この値を取り出したいということが簡単にできません

単純にこうすると
"{1,2}{2,3}{3,4}".match(/\{([0-9]+),([0-9]+)\}/)
["{1,2}", "1", "2"]

1 と 2 も取れていますが 最初の一つだけです

マッチする全部取得するために g オプションをつけると
"{1,2}{2,3}{3,4}".match(/\{([0-9]+),([0-9]+)\}/g)
["{1,2}", "{2,3}", "{3,4}"]

全部マッチしますが 1 や 2 のキャプチャが返ってきません

対策

方法1

g つき match の結果の配列を map で g なしの match するということもできます
var reg_str = String.raw `\{([0-9]+),([0-9]+)\}`
"{1,2}{2,3}{3,4}".match(new RegExp(reg_str, "g"))
    .map(t => t.match(new RegExp(reg_str)))
[ ["{1,2}", "1", "2"], ["{2,3}", "2", "3"], ["{3,4}", "3", "4"] ]

でもこれは正規表現チェックを何度も繰り返しているので 効率悪そうです

方法2

match とは目的が違いますが replace を使うこともできます
var result = []
"{1,2}{2,3}{3,4}".replace(/\{([0-9]+),([0-9]+)\}/g, (a,b,c) => result.push([a,b,c]))
result
[ ["{1,2}", "1", "2"], ["{2,3}", "2", "3"], ["{3,4}", "3", "4"] ]

方法3

文字列のメソッドではなく 正規表現オブジェクトの方のメソッドを使うこともできます
こっちが正しい方法に思います
var re = /\{([0-9]+),([0-9]+)\}/g
var result = []
var tmp
while(tmp = re.exec("{1,2}{2,3}{3,4}")) result.push(tmp)
result
[ ["{1,2}", "1", "2"], ["{2,3}", "2", "3"], ["{3,4}", "3", "4"] ]

この場合は result は 2 重の配列ですが 内側の配列にはマッチした場所を表す index プロパティが入ってます
replace の方法でも 捨ててる引数にあるので 必要なら同じようにすることは可能です

exec に空文字マッチする正規表現があると

方法3 で使った exec の方法ですが 注意点があります

正規表現が
var re = /()/g

の場合 無限ループします

理由は 空文字でマッチするので index が進まないからです

正規表現オブジェクトは内部で次にどこから検索するかの lastIndex プロパティを持っています
var re = /def/g
re.exec("abcdefghijk")
dir(re)
/def/g
    flags: "g"
    global: true
    ignoreCase: false
    lastIndex: 6
    multiline: false
    source: "def"
    sticky: false
    unicode: false
    __proto__: Object

lastIndex は 6 なので 次の検索は 「g」 の場所から 行われます
2 回目で検索対象の文字列を別の文字列にもできますが lastIndex の場所から検索するので思い通りに動かないことが多いです

空文字の場合はマッチした場所が 0 文字目で文字列の長さも 0 なので 次の検索場所が ずっと 0 文字目からです


マッチした文字列の長さが 0 なら lastIndex を強制的に +1 するか 0 文字マッチは通常想定しないものだと思うので そこで break して抜けてしまうのが良いかと思います
var re = /()/g
var result = []
var tmp
while((tmp = re.exec("{1,2}{2,3}{3,4}")) && tmp[0].length){
    result.push(tmp)
}