딥다이브 스터디 31,32,33 (RegExp, String, Symbol)

김영현·2023년 11월 13일
0

RegExp(Regular Expression)

정규표현식! 이란 일정한 패턴을 가진 문자열을 뽑아내기위한 형식 언어다.
대부분의 프로그래밍언어에 내장되어있음!
장황한 조건문을 쓰지않아도 문자열 패턴 매칭이 가능하기에 용이함.

참고로 정규표현식은 백트래킹기법을 활용하기에 문자열이 길어지면 효율이 떨어진다.
그때는 아마 lcs같은 알고리즘을 잘 사용해야겠지...

생성방법

빌트인객체기에 new연산자를 사용할 수도있지만, 보통 리터럴을 사용한다.
정규표현식은 패턴, 플래그로 구성된다

const str = 'Is this all there is?';

//패턴:is, 플래그:i(대소문자를 구분하지 않겠다는 의미)
const regexp = /is/i;
regexp.test(str) // true

RegExp메서드

  • exec : 매칭 결과를 배열로 반환. 없으면 null. g플래그를 사용하여도 첫번째 매칭결과만 반환하니 주의.
  • test : 인수로 전달받은 문자열에 대해 패턴검색하여 불리언 리턴
  • match: 매칭 결과를 배열로 반환.

플래그

패턴과 플래그로 구성된 정규표현식의 절반을 담당하는 키워드. 검색방식을 설정하기위해 사용한다.
6개가있는데, 중요한 3개만 보겠음.

  • i(ignore) : 대소문자 구분x
  • g(global) : 패턴과 일치하는 모든 문자열
  • m(multi line) : 문자열의 행이 바뀌어도 계속 검색

플래그는 옵션이기에 사용하지 않을 수도, 모두 사용할 수도 있음

패턴

패턴...이 제일 중요한 부분인데, 전부 적어봤자 못외워서 의미가 없을 것 같다.
어떻게 한담?


String

원시타입.
유사배열객체 + 이터러블이기에 인덱스 접근가능. But, 원시값이기에 변경 불가능
값이 바뀔때 항상 래퍼객체 이용. 내부슬롯 [[StringData]]을 활용함.

String 메서드

메서드는 원본을 변경하지 못함(원시값)따라서 언제나 새로운 문자열 반환!
또한 이때문에 래퍼객체도 읽기 전용객체로 제공된다.

주의해야할 메서드

  • indexOf : 대상문자열 내부에서 인수로 전달받은 문자열을 검색. 일치하는 첫번째 인덱스 반환 없으면 -1 반환
    => 인덱스는 0으로도 시작할 수 있어서 그렇다!

Sylbol(7번째 데이터 타입)

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(){...}

Well-known Symbol

잘 알려진 심벌이라니? 모순되는 것 같지만 들어보면 이해할 수 있다.
JS는 기본제공하는 빌트인 심벌값이 존재한다.
대표적으로 for..of문으로 순회 가능한 빌트인 이터러블(Array,String, Map...)은 Symbol.iterator를 키로 갖는 메서드를 가지며
이 메서드를 호출하면 이터레이터를 반환하도록 되어있다.

이터러블과 이터레이터는 34장에서 제대로 배운다! 순회 가능하다는 것만 알면 되겠군

profile
모르는 것을 모른다고 하기

0개의 댓글