정규표현식! 이란 일정한 패턴을 가진 문자열을 뽑아내기위한 형식 언어다.
대부분의 프로그래밍언어에 내장되어있음!
장황한 조건문을 쓰지않아도 문자열 패턴 매칭이 가능하기에 용이함.
참고로 정규표현식은 백트래킹기법을 활용하기에 문자열이 길어지면 효율이 떨어진다.
그때는 아마 lcs같은 알고리즘을 잘 사용해야겠지...
빌트인객체기에 new
연산자를 사용할 수도있지만, 보통 리터럴을 사용한다.
정규표현식은 패턴, 플래그로 구성된다
const str = 'Is this all there is?';
//패턴:is, 플래그:i(대소문자를 구분하지 않겠다는 의미)
const regexp = /is/i;
regexp.test(str) // true
exec
: 매칭 결과를 배열로 반환. 없으면 null. g
플래그를 사용하여도 첫번째 매칭결과만 반환하니 주의.test
: 인수로 전달받은 문자열에 대해 패턴검색하여 불리언 리턴match
: 매칭 결과를 배열로 반환.패턴과 플래그로 구성된 정규표현식의 절반을 담당하는 키워드. 검색방식을 설정하기위해 사용한다.
6개가있는데, 중요한 3개만 보겠음.
i
(ignore) : 대소문자 구분xg
(global) : 패턴과 일치하는 모든 문자열m
(multi line) : 문자열의 행이 바뀌어도 계속 검색플래그는 옵션이기에 사용하지 않을 수도, 모두 사용할 수도 있음
패턴...이 제일 중요한 부분인데, 전부 적어봤자 못외워서 의미가 없을 것 같다.
어떻게 한담?
원시타입.
유사배열객체 + 이터러블이기에 인덱스 접근가능. But, 원시값이기에 변경 불가능
값이 바뀔때 항상 래퍼객체 이용. 내부슬롯 [[StringData]]
을 활용함.
메서드는 원본을 변경하지 못함(원시값)따라서 언제나 새로운 문자열 반환!
또한 이때문에 래퍼객체도 읽기 전용객체로 제공된다.
주의해야할 메서드
indexOf
: 대상문자열 내부에서 인수로 전달받은 문자열을 검색. 일치하는 첫번째 인덱스 반환 없으면 -1 반환ES6에서 도입된 새로운 원시타입.
다른 값과 중복되지 않는 유일무이한 값이다.
리터럴 표기법이 없다. 함수를 사용하여 만든다.
생성자 함수가 아니다.(객체가 아니니까)
const mySymbol = Symbol();
typeof mySymbol // symbol
심벌도 객체처럼 접근하면 암묵적으로 래퍼객체를 생성함.
불리언 타입으로만 암묵적 변환이 일어난다.
심벌 값은 JS엔진 내부 global symbol registry
에 저장된다
이때 심벌값을 찾아 존재하지 않으면 만드는 메서드가 바로 Symbol.for
임.
const s1 = Symbol.for('mySymbol');
const s1 = Symbol.for('mySymbol');
s1 === s2 //true. 'mySymbol'을 키로 만든 심벌이다.
Symbol.keyFor(s1) // 'mySymbol'
아하 심벌은 키-밸류로 이루어져있구나!
const direction = {
up: 1,
down: 2,
left: 3,
right: 4
}
// 이처럼 값(1,2, 3,4)에 의미가 없고 상수의 이름자체에만 의미가 있는경우 심벌을 사용한다.
const direction = {
up: Symbol('up'),
down: Symbol('down'),
left: Symbol('left'),
right: Symbol('right')
}
심벌의 값으로 프로퍼티키를 사용할 수도 있다.
const obj = {
[Symbol.for('mySymbol')]: 1
}
obj[Symbol.for('mySymbol')] // 1
이때 심볼형 프로퍼티 숨기기(hiding symbolic property)때문에 for..in, Object.keys, Object.getOwnPropertyNames
로 꺼내올 수 없다. (Object.assign
은 심벌도 가져와 복사한다.)
따라서 외부에 노출할 필요가 없는 프로퍼티 은닉이 가능하다.
하지만 getOwnPropertySymbols
로 가져올 수 있으니 유의하자.
표준 빌트인 객체에 사용자정의 메서드를 추가하여 사용하는건 권장되지 않음
미래에 추가될 사양의 이름과 중복될 수 있음.
하지만 심벌을 사용한다면 중복방지가 가능!
Array.prototype[Symbol.for('sum')] = function(){...}
잘 알려진 심벌이라니? 모순되는 것 같지만 들어보면 이해할 수 있다.
JS는 기본제공하는 빌트인 심벌값이 존재한다.
대표적으로 for..of
문으로 순회 가능한 빌트인 이터러블(Array,String, Map...)은 Symbol.iterator
를 키로 갖는 메서드를 가지며
이 메서드를 호출하면 이터레이터를 반환하도록 되어있다.
이터러블과 이터레이터는 34장에서 제대로 배운다! 순회 가능하다는 것만 알면 되겠군