[trouble shooting] 전역 플래그와 test()

roses16·2023년 2월 15일
0

문제

전역플래그 g 를 사용한 정규 표현식에서 test() 함수 사용 시 true가 반환되어야 하는 조건에서 true와 false를 번갈아가며 반환시키는 문제

let exp = /[a-z]/g
let arr = Array.from('abcdef')
for( e of arr.values()) 
    console.log(exp.test(e))

// 출력 : 
// true
// false
// true
// false
// true
// false

위와 같은 반복문에서 정규표현식 조건에 부합함에도 불구하고 true와 false가 번갈아가며 나오는 문제가 확인되었다.


원인

전역플래그 gtest() 함수를 함께 사용할 때, 검색에 성공할 경우 다음 검색을 위해 성공한 다음 index를 lastIndex로 저장하고 해당 인덱스부터 다음 test() 함수를 실행한다. lastIndex는 검색에 실패했을 때 0으로 초기화된다.

위 문제에서 'a' 검색에 성공했을 때 lastIndex는 1이 되고, b를 검색할 때 string 내 1번 인덱스가 없자 false를 반환한 후 lastIndex를 0으로 초기화한다. 때문에 true와 false가 반복된다.

let exp = /[a-z]/g
let arr = Array.from('abcdef')
for( e of arr.values()){
    console.log(exp.test(e), exp.lastIndex)	//	test() 결과와 lastIndex를 함께 출력한다.
}

// true 1
// false 0
// true 1
// false 0
// true 1
// false 0

해결

  • 전역플래그 g를 제외한다.
  • 정규표현식을 변수에 담아 반복하는 대신 /[a-z]/g 상수형태로 사용한다.
  • lastIndex를 강제로 초기화 시켜준다. exp.lastIndex = 0;

📌 참조

profile
frontend developer 📚

0개의 댓글