자바스크립트

Section 6. 자바스크립트 String 객체

포칼이 2023. 3. 30. 19:37

I. 생성자 함수

const strObj1 = new String();
const strObj2 = new String('Hello World!');

console.log(strObj1);
console.log(strObj2);

strObj1과 strObj2의 출력을 비교하면 다음과 같다. 

PrimitiveValue가 다른 것을 확인 할 수 있다. 또한 여기서 문자열도 유사배열 객체인 것을 확인 가능하다. 

console.log(strObj1.valueOf(), strObj1.toString()); //  
console.log(strObj2.valueOf(), strObj2.toString()); //Hello World! Hello World!

valueOf 또는 toString 메서드는 해당 문자열의 원시값을 반환한다.

const fromNum = new String(123);
const fromBool = new String(true);
const fromArr = new String([1, 'A', false]);
const fromObj = new String({a: 1});

console.log(typeof fromNum, fromNum); //object String {'123'}
console.log(typeof fromBool, fromBool); //object String {'true'}
console.log(typeof fromArr, fromArr); //object String {'1,A,false'}
console.log(typeof fromObj, fromObj); //object String {'[object Object]'}

다른 타입들도 감쌀 수 있는 것을 확인 할 수 있다. 문자열로 변호나한 값을 가진 String 객체를 반환한다.

 

추가적으로 new 없이 사용하면?

const str1 = String('Hello World!');
const str2 = String(123);
const str3 = String(true);
const str4 = String({x: 1, y: 2}); // 💡 [object Object]
const str5 = String([1, 2, 3]); // 💡 1,2,3

console.log(typeof str1, str1); //string Hello World!
console.log(typeof str2, str2); //string 123
console.log(typeof str3, str3); //string true
console.log(typeof str4, str4); //string [object Object]
console.log(typeof str5, str5); //string 1,2,3

생성자로서가 아닌 String 함수는 주어진 인자를 문자열로 변환하여 반환한다. 

 

II. 유사 배열 객체

let myStr = '안녕하세요!';

console.log(
  myStr.length,
  myStr[0],
  myStr[myStr.length - 1]
); //6 '안' '!'

myStr[myStr.length - 1] = '?';
console.log(myStr); //안녕하세요!

for (const letter of myStr) {
  console.log(letter);
}
//안
//녕
//하
//세
//요
//!

두번째 단락에 있는 코드를 보면 myStr의 마지막 요소를 ?로 바꿨는데 막상 출력을 해보면 바뀌지 않은 것을 볼 수 있다.

이유는 String은 원시값이기 때문이다. 즉, 배열처럼 접근하는 방식으로는 수정이 불가능 하다는 뜻이다. 굳이 수정하려면 변수 값 자체를 다른 문자열로 대체해야 한다.

 

정리하자면 다음과 같다.

  • length 프로퍼티 : 글자 수 반환한다
  • [ ] 안에 인덱스 숫자를 넣어 ~번째 글자 읽기(만) 가능하다
  • for ... of문 사용가능. 이터러블이기 때문이다

III. 주요 인스턴스 메서드

1. toUpperCase, toLowerCase

라틴어 문자를 모두 대문자/소문자로 변경하여 반환하는 메서드이다.

const word = 'Hello, World.';
console.log(
  word.toUpperCase(),
  word.toLowerCase()
); //HELLO, WORLD. hello, world.

console.log(word); //Hello, World.

기존의 문자열은 바꾸지 않는다는 점이 포인트이다. 그리고 이 아래에 소개되는 메서드들도 마찬가지이다.

 

2. charAt, at 

인자로 주어진 인덱스의 문자를 반환하는 메서드이다.

 

charAt 메서드 예시는 다음과 같다.

console.log(
  'Hello World!'.charAt(0),
  '안녕하세요~'.charAt(2)
); //H 하

 

at 메서드 예시는 다음과 같다.

console.log(
  '안녕하세요~'.at(1),
  '안녕하세요~'.at(-1)
); //녕 ~

신기능이고 배열에서도 사용가능하다.

음수로 뒤에서부터 접근 가능한 것을 볼 수 있다(-1부터).

 

3. indexOf, lastIndexOf

indexOf는 인자로 주어진 문자열이 앞에서 처음 나타나는 인덱스를 반환한다.

lastIndexOf는 인자로 주어진 문자열이 앞에서 부터 가장 마지막으로 나타나는 인덱스를 반환한다.

포함되지 않을 시 -1을 반환한다.

const word = '반갑습니다!';
console.log (
  word.indexOf('습'),
  word.lastIndexOf('습')
); //2 2

 

4. includes, startsWith, endsWith

인자로 주어진 문자열을 포함 (아무곳에/ 맨 앞에/ 맨 끝에) 여부를 불리언으로 반환하는 메서드이다.

const sentence = '옛날에 호랑이 한 마리가 살았어요.';

for (const word of ['옛날에', '호랑이', '살았어요.', '나무꾼']) {
  console.log(
    'includes', word, sentence.includes(word)
  );
  console.log(
    'startsWith', word, sentence.startsWith(word)
  );
  console.log(
    'endsWith', word, sentence.endsWith(word)
  );
  console.log('- - - - -');
}

출력문은 다음과 같다.

 

5. search

인자로 받은 정규표현식과 일치하는 첫 부분의 인덱스를 반환하는 메서드이다.

없을 시 -1을 반환한다.

console.log(
  '하루가 7번 지나면 1주일이 되는 거야.'.search(/[0-9]/),
  '하루가 일곱 번 지나면 일주일이 되는 거야.'.search(/[0-9]/)
); //4 -1

 

6. substring

인자로 전달받은 인덱스(들)을 기준으로 자른 문자열을 반환하는 메서드이다.

const word = 'ABCDEFGHIJKL';
const part = word.substring(4, 8)

console.log(word, part); //ABCDEFGHIJKL EFGH

console.log(
  word.substring(-1),
  word.substring(4, 100),
  word.substring(100)
); //ABCDEFGHIJKL EFGHIJKL

인자를 하나만 넣으면 해당 인덱스부터 끝까지 반환한다.

음수나 범위 외 숫자는 범위 내 최소/최대 숫자로

 

7. slice

substring과 같으나 음수로 뒤에서부터 자를 수 있는 메서드이다. 

const word = 'ABCDEFGHIJKL';
console.log(
 word.substring(-4),
 word.slice(-4)
); //ABCDEFGHIJKL IJKL

 

8. split

인수로 주어진 문자열이나 정규표현식으로 분리하여 배열을 반환하는 메서드이다. 

console.log(
  '010-1234-5678'.split('-'),
  'ABC1DEF2GHI3JKL'.split(/[0-9]/)
) 
// ['010', '1234', '5678'] 
// ['ABC', 'DEF', 'GHI', 'JKL']
// 인자로 빈 문자열을 넣거나 인자 생략시
const word = '안녕하세요';

console.log(
  word.split(''),
  word.split()
)
// ['안', '녕', '하', '세', '요'] 
// ['안녕하세요']
const word = '하나 하면 할머니가 지팡이 짚고서 잘잘잘';

console.log(
  word.split(' ', 2),
  word.split(' ', 4)
)
//['하나', '하면'] 
//['하나', '하면', '할머니가', '지팡이']

두 번째 인자로 배열의 최대 길이 지정이 가능하다.

 

9. trim, trimStart, trimEnd

앞뒤의 공백 제거하여 반환하는 메서드이다.

const word = '  Hello World!  ';
console.log(`--${word}--`); //--  Hello World!  --
console.log(`--${word.trim()}--`); //--Hello World!--
console.log(`--${word.trimStart()}--`); //--Hello World!  --
console.log(`--${word.trimEnd()}--`); //--  Hello World!--

중간의 공백은 제거하지 않는다.

 

10. repeat

인자로 주어진 정수만큼 문자열을 반복하여 반환하는 메서드이다. 

const word = '호이';

console.log(word.repeat(3)); //호이호이호이
console.log(word.repeat(0)); // 
console.log(word.repeat()); //
console.log(word.repeat(-1)); //애러

인수가 없거나 0이면 빈 문자열을 반환하고 음수면 오류를 발생시킨다.

 

11. replace, replaceAll

첫 번째 인자로 받은 문자열 또는 정규식을 두 번째 인자로 치환한 결과를 반환하는 메서드이다. 

console.log(
  '이스탄불은 터키의 수도이다.'.replace('터키', '튀르키예')
); //이스탄불은 튀르키예의 수도이다.
const word = '철권은 최고의 게임이다. 철권 대회 준비한다.';

console.log(word.replace('철권', '와우')); //와우은 최고의 게임이다. 철권 대회 준비한다.

replace 의 첫 인자가 문자열이면 일치하는 첫 부분만 치환한다.

모두 치환하려면 정규식 /.../g 를 사용한다.

console.log(word.replaceAll(/철권/g, '와우')); //와우은 최고의 게임이다. 와우 대회 준비한다.

replaceAll 은 문자열도 자동으로 /.../g 처럼 인식한다.

 

메서드 체이닝 method chaining

값을 반환하는 인스턴스 메서드를 연속으로 사용하는 것을 말한다. 

const word = ' 모두 HELLO! ';
const rpFrom = 'hello';
const rpTo = 'bye';

console.log(
  word
  .trimStart()                // '모두 HELLO! '
  .toLowerCase()              // '모두 hello! '
  .replaceAll(rpFrom, rpTo)   // '모두 bye! '
  .toUpperCase()              // '모두 BYE! '
  .repeat(3)                  // '모두 BYE! 모두 BYE! 모두 BYE! '
  .trimEnd()                  // '모두 BYE! 모두 BYE! 모두 BYE!'
); //모두 BYE! 모두 BYE! 모두 BYE!

console.log(word); //모두 HELLO!

원본은 그대로인 것을 확인하고 넘어가자.