Почему новый matchAll в Javascript возвращает итератор (а не массив)?

ES2020 содержит новый String.prototype.matchAllметод, который возвращает итератор. Я уверен, что мне не хватает чего-то глупого / очевидного, но я не понимаю, почему вместо этого он просто не возвращает массив.

Может кто-нибудь объяснить там логику?

РЕДАКТИРОВАТЬ: просто чтобы прояснить что-то из комментариев, я исхожу из предположения, что итераторы не просто заменили массивы, поскольку новый способ, которым все JS API будут возвращать несколько значений. Если я пропустил эту записку и все новые функции JS возвращают итераторы, ссылка на указанную записку будет на 100% квалифицироваться как действительный ответ.

Но опять же, я подозреваю, что такого общего изменения не было, и что создатели Javascript сделали конкретный выбор для этого конкретного метода, чтобы он возвращал итератор... и логика этого выбора - это то, что я ' м пытаюсь понять.

0 ответов

Это описано в предложении:

Для многих вариантов использования может потребоваться массив совпадений, однако явно не все. Особо большое количество групп захвата или большие строки могут повлиять на производительность, если всегда собирать их все в массив. Возвращая итератор, его можно тривиально собрать в массив с помощью оператора распространения или Array.from, если вызывающий желает, но в этом нет необходимости.

.matchAllэто ленивый. При использовании итератора регулярное выражение будет оценивать следующее совпадение в строке только после того, как предыдущее совпадение будет повторено. Это означает, что если регулярное выражение является дорогостоящим, первые несколько совпадений могут быть извлечены, а затем ваша логика JS может заставить итератор отказываться от попытки дальнейших совпадений.

Тривиальный пример ленивого вычисления в действии:

         for (const match of 'axxxxxxxxxxxxxxxxxxxxxxxxxxxxy'.matchAll(/a|(x+x+)+y./g)) {
  if (match[0] === 'a') {
    console.log('Breaking out');
    break;
  }
}
console.log('done');

Без break, регулярное выражение продолжит попытку второго совпадения, что приведет к очень дорогостоящей операции.

Если matchAll вернул массив и перебрал все совпадения сразу при создании массива, было бы невозможно спастись.

Другие вопросы по тегам