Холодный осенний ливень стучал по потрескавшемуся капоту моего «Жигуля», будто пытался пробить металл и смыть меня вместе с горем в грязные потоки асфальта. Каждая капля отдавалась в висках, как молот по наковальне моей судьбы. Я только что выбежала из больни# String
## 1. String 생성자 함수
— 표준 빌트인 객체인 **String 객체는 생성자 함수 객체**이다.
— new 연산자와 함께 String 인스턴스를 생성할 수 있다.
— String 생성자 함수에 인수를 전달하지 않고 new 연산자와 함께 호출하면 [[StringData]] 내부 슬롯에 빈 문자열을 할당한 String 래퍼 객체를 생성한다.
— [[StringData]] : String 래퍼 객체가 가지고 있는 내부 슬롯으로, 문자열을 저장한다.
— String 생성자 함수에 인수로 문자열을 전달하면서 new 연산자와 함께 호출하면 [[StringData]] 내부 슬롯에 인수로 전달받은 문자열을 할당한 String 래퍼 객체를 생성한다.
— String 생성자 함수에 인수로 문자열이 아닌 값을 전달하면 인수를 문자열로 강제 변환한 후, [[StringData]] 내부 슬롯에 변환된 문자열을 할당한 String 래퍼 객체를 생성한다.
— new 연산자를 사용하지 않고 String 생성자 함수를 호출하면 String 인스턴스가 아닌 문자열을 반환한다.
«`javascript
// new 연산자와 함께 호출 : String 인스턴스 생성
const strObj1 = new String(); // String {length: 0, [[PrimitiveValue]]: «»}
const strObj2 = new String(‘Lee’); // String {0: «L», 1: «e», 2: «e», length: 3, [[PrimitiveValue]]: «Lee»}
// [[PrimitiveValue]] : String 래퍼 객체가 가지고 있는 내부 슬롯, 접근 불가
// String 래퍼 객체는 유사 배열 객체이면서 이터러블이다. 따라서 배열과 유사하게 인덱스를 사용하여 각 문자에 접근할 수 있다.
console.log(strObj2[0]); // L
// String 래퍼 객체는 배열과는 달리 immutable value이다. 따라서 변경 불가능하다.
strObj2[0] = ‘S’;
console.log(strObj2[0]); // L
// new 연산자를 사용하지 않고 String 생성자 함수 호출 : 문자열 반환
String(123); // «123»
String(NaN); // «NaN»
String(Infinity); // «Infinity»
String(true); // «true»
String(false); // «false»
«`
## 2. length 프로퍼티
— length 프로퍼티는 문자열의 문자 개수를 반환한다.
— String 래퍼 객체는 유사 배열 객체이다. 따라서 인덱스를 사용하여 각 문자에 접근할 수 있다.
«`javascript
‘hello’.length; // 5
‘안녕하세요!’.length; // 6
«`
## 3. String 메서드
— String 객체에는 **원본 String 래퍼 객체를 직접 변경하는 메서드가 존재하지 않는다.**
— 즉, String 객체의 메서드는 언제나 새로운 문자열을 생성하여 반환한다.
— 문자열은 immutable value이기 때문에 **String 래퍼 객체도 읽기 전용 객체로 제공된다.**
— String 래퍼 객체가 읽기 전용 객체가 아니라면, 변경된 String 래퍼 객체를 문자열로 되돌릴 때 문자열이 변경될 것이다.
### 3.1. indexOf
— `indexOf` 메서드는 대상 문자열(메서드를 호출한 문자열)에서 인수로 전달받은 문자열을 검색하여 첫 번째 인덱스를 반환한다.
— 검색에 실패하면 -1을 반환한다.
— 대상 문자열에 특정 문자열이 존재하는지 확인할 때 유용하다.
«`javascript
const str = ‘hello world’;
str.indexOf(‘l’); // 2
str.indexOf(‘or’); // 7
str.indexOf(‘x’); // -1
// 2번째 인수로 검색을 시작할 인덱스 지정
str.indexOf(‘l’, 3); // 3
// 대상 문자열에 특정 문자열이 존재하는지 확인
if (str.indexOf(‘hello’) !== -1) {
console.log(‘hello가 존재합니다.’);
}
// ES6에서 도입된 String.prototype.includes 메서드를 사용하면 가독성이 더 좋다.
if (str.includes(‘hello’)) {
console.log(‘hello가 존재합니다.’);
}
«`
### 3.2. search
— `search` 메서드는 대상 문자열에서 인수로 전달받은 정규 표현식과 매치하는 문자열을 검색하여 일치하는 문자열의 인덱스를 반환한다.
— 검색에 실패하면 -1을 반환한다.
«`javascript
const str = ‘hello world’;
str.search(/o/); // 4
str.search(/x/); // -1
«`
### 3.3. includes
— `includes` 메서드는 대상 문자열에 인수로 전달받은 문자열이 포함되어 있는지 확인하여 그 결과를 불리언 값으로 반환한다.
— 2번째 인수로 검색을 시작할 인덱스를 전달할 수 있다.
«`javascript
const str = ‘hello world’;
str.includes(‘hello’); // true
str.includes(»); // true -> 빈 문자열은 모든 문자열에 포함되어 있다고 판단한다.
str.includes(‘x’); // false
str.includes(); // false
// 2번째 인수로 검색을 시작할 인덱스 지정
str.includes(‘l’, 3); // true
str.includes(‘h’, 3); // false
«`
### 3.4. startsWith
— `startsWith` 메서드는 대상 문자열이 인수로 전달받은 문자열로 시작하는지 확인하여 그 결과를 불리언 값으로 반환한다.
— 2번째 인수로 검색을 시작할 인덱스를 전달할 수 있다.
«`javascript
const str = ‘hello world’;
str.startsWith(‘he’); // true
str.startsWith(‘x’); // false
// 2번째 인수로 검색을 시작할 인덱스 지정
str.startsWith(‘ ‘, 5); // true
«`
### 3.5. endsWith
— `endsWith` 메서드는 대상 문자열이 인수로 전달받은 문자열로 끝나는지 확인하여 그 결과를 불리언 값으로 반환한다.
— 2번째 인수로 검색할 문자열의 길이를 전달할 수 있다.
«`javascript
const str = ‘hello world’;
str.endsWith(‘ld’); // true
str.endsWith(‘x’); // false
// 2번째 인수로 검색할 문자열의 길이 지정
str.endsWith(‘lo’, 5); // true
«`
### 3.6. charAt
— `charAt` 메서드는 대상 문자열에서 인수로 전달받은 인덱스에 위치한 문자를 검색하여 반환한다.
— 인덱스는 문자열의 범위, 즉 0 ~ (문자열 길이 — 1) 사이의 정수이어야 한다.
— 인덱스가 문자열의 범위를 벗어난 정수인 경우 빈 문자열을 반환한다.
«`javascript
const str = ‘hello’;
str.charAt(0); // h
str.charAt(5); // »
// 문자열에서 인덱스가 i인 문자를 반환하는 방법
str[0]; // h -> ES6에서 도입된 방식
str[5]; // undefined
«`
### 3.7. substring
— `substring` 메서드는 대상 문자열에서 첫 번째 인수로 전달받은 인덱스에 위치하는 문자부터 두 번째 인수로 전달받은 인덱스에 위치하는 문자의 바로 이전 문자까지의 부분 문자열을 반환한다.
— 첫 번째 인수 > 두 번째 인수인 경우 두 인수는 교환된다.
— 인수 < 0 또는 NaN인 경우 0으로 취급된다.
- 인수 > 문자열의 길이(str.length)인 경우 인수는 문자열의 길이(str.length)로 취급된다.
«`javascript
const str = ‘hello world’;
str.substring(1, 4); // ell
str.substring(1); // ello world
// str.substring(1, 100); // ello world
// str.substring(-1); // hello world
// 첫 번째 인수 > 두 번째 인수인 경우 두 인수는 교환된다.
str.substring(4, 1); // ell
// 인수 < 0 또는 NaN인 경우 0으로 취급된다. str.substring(-1); //