Будет ли ES6 RegExps поддерживать протокол Iterator?
Я не могу найти ответ в спецификации или списке предложений относительно того, будет ли RegExps в ES6 предоставлять необходимые методы для поддержки протокола Iterator для соответствующих групп. Существует несколько методов обработки символов, но я недостаточно знаком с семантикой различных символов, чтобы сказать, будут ли они обеспечивать это.
Я хотел бы представить что-то вроде:
var rex = /((\w+)\s?)*/;
var res = rex.exec("test string");
console.log(res);
for (let match of res) {
console.log(match);
}
Это похоже на работу в REPL 6to5, запись ожидаемого "test string"
, "string"
, "string"
,
Это конкретно определено в спецификации ES6, и если нет, то какие свойства результата регулярного выражения позволяют ему работать? Или это просто артефакт 6to5, который не совсем ES6?
1 ответ
res
это просто Array
из матчей. Вы можете проверить это, используя один из следующих вариантов:
Object.prototype.toString.call(res) === '[object Array]'
res instanceof Array;
Array.isArray(res);
res.constructor === Array;
А массивы в ES6 поддерживают интерфейс итератора. Смотрите здесь или в MDN: Array.prototype [@@ iterator]
Как насчет input
а также index
свойства - они просто добавлены к res
массив по exec
метод. Например, вы можете проверить исходный код v8:
- RexExpExec метод JS
- RegExpImpl:: Exec C++
- SetLastMatchedInfo (последняя найденная информация - наша
res
объект)