Почему новый 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
вернул массив и перебрал все совпадения сразу при создании массива, было бы невозможно спастись.