RegExp#exec() 가 돌려주는 배열에는 undefined 가 포함되어 있을지도 모른다

갑자기 말해도 핀과 오지 않는다고 생각하기 때문에, 이미지를 준비했습니다.
const result = /a(b)?/.exec('a');
const { length } = result; // 2
const [matched, capture1] = result; // "a", undefined

groups 는 명명된 캡처를 사용하지 않으면 undefined 그래서 좋다고 해서, result[1]undefined 네요.
다만, 이 정도 단순한 경우, 쓰는 방법을 바꾸면 그것을 회피할 수 있습니다.
const result = /a(b?)/.exec('a');
const { length } = result; // 2
const [matched, capture1] = result; // "a", ""


이 동작의 차이는 0자를 캡처한 그룹과 원래 적용되지 않은 그룹의 차이입니다.? 또는 * , | 에 의해 건너뛴 그룹을 캡처할 수는 없습니다.
그 경우, RegExp#exec() 의 배열의 요소수는 변하지 않고, undefined 가 대입됩니다 1

이 거동은 ES5 시점부터 변함없이 사양으로 정해져 있습니다 .

MDN(영어판)에도 쓰지 않은 거동 2 그래서 RegExp#exec() 이나 String#replace(regex, replaceFunction) 로 건너뛰는 캡처 그룹은 기술하지 않는 편이 혼란이 줄어들 것입니다.



그러나 매우 오래된 일부 브라우저 (IE 포함)는 undefined가 아닌 ""입니다. .

영어권이라면 블로그라든지에서는 얼른 기술되어 있지만, 일본어권에서는 전무. 왜냐하면 빠지기 쉬운 함정이지만 MDN에 쓰여지지 않은 것은 어떨까요

좋은 웹페이지 즐겨찾기