Стандарт ( ECMAScript 5 ) довольно понятен.Длина должна быть 4, и IE неправильный (шокирует, я знаю).
Из §15.10.2.1, « NcapturingParens - это общее количество оставленных скобок для захвата».У вас есть 3.
"A State - упорядоченная пара ( endIndex , захватывает ), где endIndex - этоцелое число и захватывает является внутренним массивом значений NcapturingParens . [...] n-й элемент захватывает является либо строкой, представляющей значение, полученноеn-й набор скобок захвата или undefined , если n-й набор скобок захвата еще не достигнут. "
§15.10.6.2, который описывает exec, говорит:
9.di Пусть r будет State результатом вызова [[Match]].[...]
12.Пусть n будет длиной r s захватывает массив.(Это то же значение, что и 15.10.2.1 NCapturingParens .)
13.Пусть A будет новым массивом, созданным как будто выражением new Array () [...]
17.Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами "length", дескриптором свойства {[[Value]]: I + 1} и true.[...]
20.Для каждого целого числа i такого, что I> 0 и I ≤ n
a.Пусть captureI будет ith элементом r s захватывает массив.
b.Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString ( i ), дескриптор свойства {[[Value]]: captureI , [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и true.
21.Возврат A .
Таким образом, длина должна быть 4 (3 + 1), а захваты, которые не достигнуты (например, (\s*(\w+))
в вашем шаблоне), остаются неопределенными,К счастью, undefined и "" (пустая строка) являются ложными.Это означает, что они ложны, когда рассматриваются как логическое значение.Таким образом, вы можете обойти ошибку IE, выполнив if(matches[2])