표준 내장(빌트인) 객체인 String
객체는 생성자 함수 객체다. 따라서 new
연산자와 함께 호출하여 String
인스턴스를 생성할 수 있다.
String
생성자 함수에 인수를 전달하지 않고 new
연산자와 함께 호출하면 [[StringData]] 내부 슬롯에 빈 문자열을 할당한 String
래퍼 객체를 생성한다.
const strObj = new String('Lee');
console.log(strObj); // String {0: "L", 1: "e", length: 3, [[PrimitiveValue]]: "Lee"}
String
래퍼 객체는 배열과 마찬가지로 length
프로퍼티와 인덱스를 나타내는 숫자 형식의 문자열을 프로퍼티 키로, 각 문자를 프로퍼티 값으로 갖는 유사 배열 객체이면서 이터러블이다. 따라서 배열과 유사하게 인덱스를 사용하여 각 문자에 접근할 수 있다.console.log(strObj[0]); // L
strObj[0] = 'S';
console.log(strObj); // 'Lee'
String
생성자 함수의 인수로 문자열이 아닌 값을 전달하면 인수를 문자열로 강제 변환한 후, [[StringData]] 내부 슬롯에 변환된 문자열을 할당한 String
래퍼 객체를 생성한다.let strObj = new String(123);
console.log(strObj);
// String {0: "1", 1: "2", 2: "3", length: 3, [[PrimitiveValue]]: "123"}
strObj = new String(null);
console.log(strObj);
// String {0: "n", 1: "u", 2: "l", : "l", length: 4, [[PrimitiveValue]]: "null"}
new
연산자를 사용하지 않고 String
생성자 함수를 호출하면 String
인스턴스가 아닌 문자열을 반환한다. 이를 이용하여 명시적으로 타입을 변환하기도 한다.// 숫자 -> 문자열
String(1); // '1'
String(NaN); // 'NaN'
// 불리언 -> 문자열
String(true); // 'true'
length
프로퍼티는 문자열의 문자 개수를 반환한다.'Hello'.length; // 5
'안녕하세요!'.length; // 6
indexOf
메서드는 대상 문자열(메서드를 호출한 문자열)에서 인수로 전달받은 문자열을 검색하여 첫 번째 인덱스를 반환하고, 검색에 실패하면 -1을 반환한다.
indexOf
메서드의 2번째 인수로 검색을 시작할 인덱스를 전달할 수 있다.
기본 문법
str.indexOf(searchValue[, fromIndex])
매개변수
searchValue
: 찾으려는 문자열, 아무 값도 주어지지 않으면 문자열undefined
를 찾으려는 문자열로 사용한다.fromIndex
: 검색을 시작할 인덱스
const str = 'Hello world';
str.indexOf('l'); // 2
str.indexOf('or'); // 7
str.indexOf('x'); // -1, 검색에 실패한 경우
// 3번째 인덱스부터 검색을 시작한다.
str.indexOf('l, 3'); // 3
indexOf
메서드는 대상 문자열에서 특정 문자열이 존재하는지 확인할 때 유용하다.if (str.indexOf('Hello') !== -1) {
// 문자열 str에 'Hello'가 포함되어 있는 경우에 처리할 내용
}
search
메서드는 대상 문자열에서 인수로 전달받은 정규 표현식과 매치하는 문자열을 검색하여 일치하는 문자열의 인덱스를 반환하며, 검색에 실패 시 -1을 반환한다.기본 문법
str.search(regexp)
매개변수
regexp
: 정규 표현식 객체
const str = 'Hello world';
str.search(/o/); // 4
str.search(/x/); // -1, 검색에 실패한 경우
ES6에서 도입된 includes
메서드는 대상 문자열에 인수로 전달받은 문자열이 포함되어 있는지 확인하여 그 결과를 boolean
값으로 반환한다.
includes
메서드의 2번째 인수로 검색을 시작할 인덱스를 전달할 수 있다.
기본 문법
str.includes(searchString[, position])
매개변수
searchString
: 찾으려는 문자열, 정규표현식이 올 수 없다.position
: 검색을 시작할 인덱스
const str = 'Hello world';
str.includes('Hello'); // true
str.includes(''); // true
str.includes('x'); // false
str.includes(); // false
str.includes('l', 3); // true
str.includes('H', 3); // false
ES6에서 도입된 startsWith
메서드는 대상 문자열이 인수로 전달받은 문자열로 시작하는지 확인하여 그 결과를 boolean
값으로 반환한다.
startsWith
메서드의 2번째 인수로 검색을 시작할 인덱스를 전달할 수 있다.
기본 문법
str.startsWith(searchString[, position])
매개변수
searchString
: 문자열의 시작 시점에서 찾을 문자열, 정규표현식이 올 수 없다.position
: 검색을 시작할 인덱스
const str = 'Hello world';
str.startsWith('He') // true
str.startsWith('x') // false
// 문자열 str의 인덱스 5부터 시작하는 문자열이 ` `(공백)으로 시작하는지 확인
str.startsWith(' ', 5) // true
ES6에서 도입된 endsWith
메서드는 대상 문자열이 인수로 전달받은 문자열로 끝나는지 확인하여 그 결과를 boolean
값으로 반환한다.
endsWith
메서드의 2번째 인수로 검색할 문자열의 길이를 전달할 수 있다.
기본 문법
str.endsWith(searchString[, length])
매개변수
searchString
: 대상 문자열이searchstring
문자열로 끝나는지 찾는 문자열length
: 찾고자 하는 문자열의 길이
const str = 'Hello world';
// 문자열 str이 'ld'로 끝나는지 확인
str.endsWith('ld') // true
// 문자열 str이 'x'로 끝나는지 확인
str.endsWith('x') // false
// 문자열 str의 처음부터 5자리까지('Hello')가 'lo'로 끝나는지 확인
str.endsWith('lo', 5) // true
charAt
메서드는 대상 문자열에서 인수로 전달받은 인덱스에 위치한 문자를 검색하여 반환한다.
인덱스는 문자열의 범위(0 ~ 문자열의 길이 - 1) 사이의 정수이어야 하며, 인덱스가 문자열의 범위를 벗어난 정수의 경우 빈 문자열을 반환한다.
기본 문법
str.charAt(index)
매개변수
index
: 해당 인덱스에서 찾을 문자열, 0과 문자열의 길이 - 1 사이의 정수값
const str = 'Hello world';
str.charAt(3); // 'l'
const str = 'Hello';
for (let i = 0; i < str.length; i++) {
console.log(str.charAt(i)); // H e l l o
}
substring
메서드는 대상 문자열에서 첫 번째 인수로 전달받은 인덱스에 위치하는 문자부터 두 번째 인수로 전달받은 인덱스에 위치하는 문자의 바로 이전 문자까지의 부분 문자열을 반환한다.
substring
메서드의 두 번재 인수는 생략 가능하며, 생략할 경우 첫 번째 인수로 전달한 인덱스에 위치하는 문자부터 마지막 문자까지 부분 문자열을 반환한다.
기본 문법
str.substring(indexStart[, indexEnd])
매개변수
indexStart
: 반환문자열의 마지막 인덱스indexEnd
(Optional) : 반환문자열의 마지막 인덱스(포함하지 않음)
const str = 'Hello World';
// 인덱스 1부터 인덱스 4이전(인덱스 3)까지의 부분 문자열을 반환한다.
str.substring(1, 4); // 'ell'
// 인덱스 1부터 마지막 문자까지 부분 문자열을 반환한다.
str.substring(1); // 'ello World'
subString
메서드의 첫 번째 인수는 두 번째 인수보다 작아야 하지만, 아래와 같이 인수를 전달해도 정상 동작한다.const str = 'Hello World'; // str.length === 11
// 첫 번째 인수가 두 번째 인수보다 큰 경우 두 인수는 교환된다.
str.substring(4, 1); // 'ell'
// 인수가 0보다 작거나, NaN인 경우 0으로 취급된다.
str.substring(-2); // 'Hello World'
// 인수가 문자열의 길이보다 큰 경우 인수는 문자열의 길이로 취급된다.
str.substring(1, 100); // 'ello World'
str.substring(20); // ''
indexOf
메서드와 함께 사용하면 특정 문자열을 기준으로 앞뒤에 위치한 부분 문자열을 반환할 수 있다.const str = 'Hello World';
// 공백의 인덱스 이전까지의 부분 문자열을 반환
str.substring(0, str.indexOf(' ')); // 'Hello'
// 공백의 인덱스 이후의 부분 문자열을 반환
str.substring(str.indexOf(' ') + 1, str.length); // 'World'
slice
메서드는 substring
메서드와 동일하게 동작한다. 단, slice
메서드에는 음수인 인수를 전달할 수 있으며, 음수인 인수를 전달하면 가장 뒤에서부터 시작하여 문자열을 잘라내어 반환한다.기본 문법
str.substring(beginIndex[, endIndex])
매개변수
beginIndex
: 추출 시작점인 0부터 시작하는 인덱스이다. 만약 음수라면, beginIndex는strLength(문자열 길이) + beginIndex
로 취급된다. (예를 들어beginIndex
가 -3이면 시작점은strLength - 3
).endIndex
(Optional) : 0부터 시작하는 추출 종료점 인덱스로 그 직전까지 추출되며, 인덱스 위치의 문자는 추출에 포함되지 않는다.
만약endIndex
가 생략된다면,silce()
는 문자열 마지막까지 추출한다. 만약 음수라면, endIndex는strLength(문자열 길이) + endIndex
로 취급된다. (예를 들어endIndex
가 -3이면 종료점은strLength - 3
)
const str = 'Hello World';
str.slice(2); // 'llo world'
str.slice(-5); // 'World'
toUpperCase
메서드는 대상 문자열을 모두 대문자로 변경한 문자열을 반환한다.기본 문법
str.toUpperCase()
const str = 'Hello World';
str.toUpperCase(); // 'HELLO WORLD'
toLowerCase
메서드는 대상 문자열을 모두 소문자로 변경한 문자열을 반환한다.기본 문법
str.toLowerCase()
const str = 'Hello World';
str.toLowerCase(); // 'hello world'
trim
메서드는 대상 문자열 앞뒤에 공백 문자가 있을 경우 공백을 제거한 문자열을 반환한다.기본 문법
str.trim()
const str = ' foo ';
str.trim(); // 'foo'
ES6에서 도입된 repeat
메서드는 대상 문자열을 인수로 전달받은 정수만큼 반복해 연결한 새로운 문자열을 반환한다.
인수로 전달받은 정수가 0이면 빈 문자열을 반환하고, 음수이면 RangeError
를 발생시킨다. 인수를 생략하면 기본값 0이 설정된다.
기본 문법
str.repeat(count);
매개변수
count
: 문자열을 반복할 횟수. 0과 양의 무한대 사이의 정수
const str = 'abc';
str.repeat(); // ''
str.repeat(0); // ''
str.repeat(1); // 'abc'
str.repeat(2); // 'abcabc'
str.repeat(2.5); // 'abcabc' (2.5 -> 2)
str.repeat(-1); // RangeError: Invalid count value
split
메서드는 대상 문자열에서 첫 번째 인수로 전달한 문자열 또는 정규 표현식을 검색하여 문자열을 구분 한 후 각 문자열로 이루어진 배열을 반환한다.
인수로 빈 문자열을 전달하면 각 문자를 모두 분리하고, 인수를 생략하면 대상 문자열 전체를 단일 요소로 하는 배열을 반환한다.
기본 문법
str.split(); str.split(separator); str.split(separator, limit);
매개변수
separator
(optional) : 원본 문자열을 끊어야 할 부분을 나타내는 문자열을 나타낸다. 실제 문자열이나 정규표현식을 받을 수 있다. 문자열 유형의separator
가 두 글자 이상일 경우 그 부분 문자열 전체가 일치해야 끊어진다.separator
가 생략되거나str
에 등장하지 않을 경우, 반환되는 배열은 원본 문자열을 유일한 원소로 가진다.separator
가 빈 문자열일 경우str
의 각각의 문자가 배열의 원소 하나씩으로 변환된다.
limit
(Optional) : 끊어진 문자열의 최대 개수를 나타내는 정수이다. 이 매개변수를 전달하면 split() 메서드는 주어진separator
가 등장할 때마다 문자열을 끊지만 배열의 원소가limit
개가 되면 멈춘다. 지정된 한계에 도달하기 전에 문자열의 끝까지 탐색했을 경우limit
개 미만의 원소가 있을 수도 있다. 남은 문자열은 새로운 배열에 포함되지 않는다.
const str = 'How are you doing?';
// 인수로 빈 문자열을 전달하면 각 문자를 모두 분리한다.
str.split('') // ['H', 'o', 'w', ' ', 'a', 'r', 'e', ' ', 'y', 'o', 'u', ' ', 'd', 'o', 'i', 'n', 'g', '?']
// 공백으로 구분(단어로 구분)하여 배열로 반환한다.
str.split(' '); // ['How', 'are', 'you', 'doing?']
// 인수를 생략하면 대상 문자열 전체를 단일 요소로 하는 배열을 반환한다.
str.split(); // ['How are you doing?']
// 두 번째 인수로 배열의 길이를 지정할 수 있다. 공백으로 구분하여 배열로 반환한다. 단, 배열의 길이는 3이다.
str.split(' ', 3); // ['How', 'are', 'you']
// \s는 여러 가지 공백 문자(스페이스, 탭 등)을 의미한다. 즉, [\t\r\n\v\f]와 같은 의미다.
str.split(/\s/); // ['How', 'are', 'you', 'doing?']
const str = 'a=b,c:d'
str.split('='); // ['a', 'b,c:d']
str.split('/'); // ['a=b,c:d']
split
메서드는 배열을 반환한다. 따라서 reverse
, join
메서드와 함께 사용하면 문자열을 역순으로 뒤집을 수 있다.function reverseString(str) {
return str.split('').reverse().join('');
}
reverseString('Hello World!'); // '!dlroW olleH'
replace
메서드는 대상 문자열에서 첫 번째 인수로 전달받은 문자열 또는 정규표현식을 검색하여 두 번째 인수로 전달한 문자열로 반환한다.기본 문법
str.replace(regexp|subStr, newSubStr|function)
매개변수
regexp
(pattern) : 정규식(RegExp
) 객체 또는 리터럴. 일치하는 항목은newSubStr
또는 지정된 함수(function
)가 반환 한 값으로 대체됩니다.
substr
(pattern) :newSubStr
로 대체 될String
. 정규식이 아닌 글자 그대로의 문자열로 처리되며, 오직 첫 번째 일치되는 문자열만 교체된다.
newSubStr
(replacement) : 첫번째 파라미터를 대신할 문자열(String
). 여러가지 대체 패턴들이 지원된다.
function
(replacement) : 주어진regexp
또는substr
에 일치하는 요소를 대체하는 데 사용될 새 하위 문자열을 생성하기 위해 호출되는 함수.
const str = 'Hello World';
// str에서 첫 번째 인수 'World'를 검색하여 두 번째 인수 'Lee'로 치환한다.
str.replace('World', 'Lee'); // 'Hello Lee'
const str = 'Hello World World';
str.replace('World', 'Lee'); // 'Hello Lee World'
replacement
문자열은 특수한 교체 패턴을 사용할 수 있다.const str = 'Hello World';
str.replace('World', '<strong>$&</strong>');
매개변수가 string으로 지정되었을 때
Pattern Inserts $$ "$" 기호를 삽입한다. $& 매치된 문자열을 삽입한다. $` 매치된 문자열 앞쪽까지의 문자열을 삽입한다. $n n이 1 이상 99 이하의 정수라면, 첫 번째 매개변수로 넘겨진 RegExp
객체에서 소괄호로 묶인 n 번째의 부분 표현식으로 매치된 문자열을 삽입한다.
replace
메서드의 첫 번째 인수로 정규 표현식을 전달할 수도 있다.const str = 'Hello Hello';
// 'hello'를 대소문자로 구별하지 않고 전역 검색한다.
str.replace(/hello/gi, 'Lee'); // 'Lee Lee'
replace
메서드의 두 번재 인수로 치환 함수를 전달할 수 있다. replace
메서드는 첫 번째 인수로 전달한 문자열 또는 정규 표현식에 매치한 결과를 두 번째 인수로 전달한 치환 함수의 인수로 전달하면서 호출하고 치환 함수가 반환한 결과와 매치 결과를 치환한다.// 카멜 케이스를 스네이크 케이스로 변환하는 함수
function camelToSnake(camelCase) {
// /.[A-Z]/g는 임의의 한 문자와 대문자로 이루어진 문자열에 매치한다.
return camelCase.replace(/.[A-Z]/g, match => {
console.log(match); // oW'
return match[0] + '_' + match[1].toLowerCase();
});
}
const camelCase = 'helloWorld';
camelToSnake(cameCase); // 'hello_world'
// 스네이크 케이스를 카멜 케이스로 변환하는 함수
// 치환 함수의 인수로 매치 결과가 전달되고, 치환 함수가 반환한 결과와 매치 결과를 치환한다.
function snakeToCamel(snakeCase) {
// /.[a-z]/g는 _와 소문자로 이루어진 문자열에 매치한다.
return snakeCase.replace(/_[a-z]/g, match => {
console.log(match); // _w'
return match[1].toUpperCase();
});
}
const snakeCase = 'hello_world';
snakeToCamel(snakeCase); // 'helloworld'
매개변수가 function으로 지정되었을 때
Possible name Supplied value match 매치된 문자열. (윗쪽의 $& 표현식으로 매치된 경우와 동일) p1, p2, ... 윗쪽의 $n 표현식과 동일하다. ($1은 p1, $2는 p2...) 예를 들어, 만약 정규표현식 /(\a+)(\b+)/ 이 주어진다면 p1은 \a+와 매치되고 p2는 \b+와 매치된다. offset 조사된 전체 문자열 중에서 매치된 문자열의 index.(예를 들어, 조사될 전체 문자열이 abcd이고, 매치된 문자열이 bc면 이 매개변수의 값은 1이 된다.) string 조사된 전체 문자열 (replace를 호출한 string)