Built-in object 2 String 문자열
String 오브젝트 🆒
- ABC 처럼 문자 처리를 위한 오브젝트
- 문자처리를 위한 함수와 프로퍼티가 포함되어 있다.
- 함수를 호출하여 문자 처리를 하게 된다. (프로퍼티 값을 구한다.)
1. 문자열 연결 방법
- 한 줄에서 연결하는 법
var book = "12" + "AB" + "가나"; //결과 값 : 12AB가나 - 줄을 분리하여 연결
- +로 문자열 연결
var concat = 123 + "abc" + "가나다"; // 결과 값 : 123abc가나다 - 역슬래시() 문자열 연결
var concat = "abc \ 가나다라"; // 결과 값 : abc가나다라줄 끝에 역슬래시를 작성한다. (역슬래시 뒤에 다른 문자는 작성불가하다)
- +로 문자열 연결
2. 프로퍼티 리스트
| 이름 | 개요 |
|---|---|
| new String() | 인스턴스 생성 |
| String 함수 | |
| String() | 문자열로 변환하여 반환 |
| fromCharCode() | 유니코드를 문자열로 변환하여 반환 (사람이 읽을 수 있는 문자가 된다) |
| String 프로퍼티 | |
| length | 문자열의 문자 수 반환 |
| String.protoType | |
| constructor | 생성자 |
| valueOf() | 프리미티브 값 반환 (인스턴스에 있는 프리미티브 값 반환) |
| toString() | 문자열로 변환 |
| charAt() | 인덱스 번째 문자 반환 |
| indexOf() | 일치하는 문자열 중에서 가장 작은 인덱스 반환 (왼쪽으로 오른쪽으로 가는데 가장 먼저 일치하는 문자의 index) |
| lastIndexOf() | 일치하는 문자열 중에서 가장 큰 인덱스 반환 (가장 오른쪽에 위치하는 문자의 index) |
| String.protoType | |
| concat() | 문자열 연결 |
| toLowerCase() | 영문 소문자로 변환 |
| toUpperCase() | 영문 대문자로 변환 |
| trim() | 문자열 앞뒤의 화이트 스페이스 삭제 (공백삭제) |
| substring() | 시작에서 끝 직전까지 값 반환 (바로 앞에까지의 값) |
| substr() | 시작 위치부터 지정한 문자 수 반환 |
| slice() | 시작에서 끝 직전까지 값 반환. substring()과 차이 있음 (추출하는 조건이 차이가 있다) |
| match() 정규표현식 사용가능 |
매치 결과 반환 (다수의 다양한 매치 가능) |
| replace() 정규표현식 사용가능 |
매치 결과를 지정한 값으로 대체 |
| search() 정규표현식 사용가능 |
검색된 첫 번째 인덱스 반환 |
| split() 정규표현식 사용가능 |
구분자로 분리하여 반환 |
| charCodeAt() | 인덱스 번째 문자를 유니코드로 반환 |
| localeCompare() | 값의 위치를 1(왼쪽),0(같음),-1(오른쪽)로 반환 |
3. 문자열로 변환
String()
| 구분 | 데이터(값) |
|---|---|
| 파라미터 | 변환대상 opt |
| 반환 | 뱐환한 값 |
- 파라미터 값을 String 타입으로 변환하여 반환한다.
- 값을 작성하지 않으면 빈문자열을 반환한다.
var value = String(123);
console.log(value); // 값 : 123
console.log(typeof value); // 값 : string
console.log(typeof ("" + 123)) // 값 : string
("" + 123)으로도 String 타입이 되지만
String(123)형태가 더 가독성이 높다.
new String()
| 구분 | 데이터(값) |
|---|---|
| 파라미터 | 값 opt |
| 반환 | 생성한 String 인스턴스 |
- String 인스턴스를 생성하여 반환한다.
var obj = new String(123);
console.log(typeof obj); // 값 : object
- 파라미터 값을 String 타입으로 변환한다.
파라미터 값이 프리미티브 값이 된다.
valueOf()
| 구분 | 데이터(값) |
|---|---|
| data | String 인스턴스, 문자 |
| 파라미터 | 값 opt |
| 반환 | 생성한 String 인스턴스 |
- String 인스턴스의 프리미티브 값을 반환한다.
var obj = new String(123);
console.log(obj.valueOf()); //값 : 123
- obj는 String 인스턴스이다.
- 파라미터 값 123이 String 인스턴스의 프리미티브 값으로 설정된다.
- obj에 프리미티브 값으로 설정된 값이 반환된다.
4. length 프로퍼티
- 문자 수를 반환한다.
var value = "ABC";
for(var k = 0; k < value.length; k++){
console.log(value[k]);
};
// 실행결과
// A
// B
// C
“ABC”를 문자 하나씩 분리하여 반복한다. 따라서 3번 반복한다.
- length 값이 반환되는 논리
value = "ABC"; 에는 length 프로퍼티가 없는데 3이 출력된다. 왜 일까?
var obj = new String("ABC");
위 코드를 개발자 모드에서 실행시킨뒤 sources에 들어가 살펴보면
오른쪽 local이 있다. 이 local에서 obj를 펼치면 length: 3이 있다. 둘은 같은 라인에 있다.
이건 value 변수와 obj가 같다는 뜻이기도 하다.
엔진이 value.length를 만나면 value가 String 타입 이므로
내부에서 new String(“ABC”)를 하게 되며(인스턴스를 생성한다.)
생성한 인스턴스의 length 값인 3을 반환하게 된다.
위 예제로 풀이하자면!
맨 처음 value에 대한 타입을 구한다.
내부에서 new String 인스턴스를 만든다. 그리고 “ABC”가 프리미티브 값에 설정된다.
이때 그 프리미티브 값을 보고 랭스를 만든다.
5. 화이트 스페이스 삭제
trim()
| 구분 | 데이터(값) |
|---|---|
| data | 삭제 대상 |
| 파라미터 | 사용하지 않음 |
| 반환 | 삭제한 결과 |
- 문자열 앞뒤의 화이트 스페이스를 삭제한다.
var value = " abcd ";
console.log(value.length); // 값 : 8
console.log(value.trim().length); // 값 : 4
그냥 value의 length는 공백을 포함하여 8,
trim()을 사용하면 앞뒤의 공백이 사라지므로 4가 반환된다.
value.trim().length처럼.으로 이어진 걸메소드 체인(Method Chain)이라고 한다.
6. 함수호출 구조 (String에 toString이 필요한 이유)
toString()
| 구분 | 데이터(값) |
|---|---|
| data | 문자열, string 인스턴스 |
| 파라미터 | 사용하지 않음 |
| 반환 | 변환한 값 |
- data 위치의 값을 String 타입으로 변환한다.
“123”.toString();
string()은 이미 문자열인데 어째서 toString()이 필요할까? 의미가 없다?
[ toString() 함수가 필요한 이유 ]
인스턴스를 만들때 toString이 인스턴스에 해당함
var twoProto = instance.__proto__.__proto__;
__proto__:
toString();
__proto__:
toString();
위처럼 __proto__ 안에 __proto__가 있는 구조이다.
아래에 있는 것은 프로퍼티를 String으로 변환하는것, 위에 있는 것은 문자열을 String으로 변환하는 것
내려가서 실행되는걸 방지하기 위해 toString()을 작성해준다.
그래서 대부분의 빌트인 오브젝트에 toString()과 valueOf()가 있는 것이다.
JS 함수 호출 구조
- 데이터 타입으로 오브젝트를 결정한다.
- 오브젝트의 함수를 호출한다.
var value = 123;
value.toString();
"123".toString();
value.toString()은 Number 오브젝트의 toString()을 호출한다.
“123”.toString()은 String 오브젝트의 toString()을 호출한다.
- toString(123);
123을 파라미터에 작성var result = toString(123); console.log(result);- Object 오브젝트의 toString()이 호출된다.
- 123을 오브젝트로 간주하여 Object 형태를 문자열로 변환한다.
- object Undefined 가 반환된다.
- 값만 입력했는데 key:value 값이 들어오기 때문이다.
7. 인덱스로 문자열 정리
cahrAt()
| 구분 | 데이터(값) |
|---|---|
| data | 반환 대상 |
| 파라미터 | 반환 기준 인덱스(index) |
| 반환 | 인덱스 번째 문자 |
-
인덱스의 문자를 반환한다.
var value = "sports"; console.log(value.charAt(1)); // 함수를 호출하는 형태 console.log(value[1]); //프로퍼티 이름으로 값을 구하는 형태 // 값 : p, pES5에선
[1]형태로 사용할 수 있다. -
문자열 길이보다 인덱스가 크면 빈문자열을 반환한다.
var value = "sports"; console.log(value.charAt(12)); // 값 : ""sports의 전체 문자열 수는 6인데 파라미터의 인덱스가 전체 문자열보다 크므로
빈 문자열을 반환한다.빈 문자열도 “값” 이다.
-
일반적으로 존재하지 않으면 undefined를 반환한다.
var value = "sports"; console.log(value[12]); // 값 : undefined12번째 인덱스가 없으므로 undefined를 반환한다.
프로퍼티 이름으로 가서 반환하기 때문에 위에 빈 문자열을 반환하는 것과는 차이가 있다.
indexOf()
| 구분 | 데이터(값) |
|---|---|
| data | 검색 대상 |
| 파라미터 | 검색한 문자열 |
| 검색 시작 위치, 디폴트 : 0 | |
| 반환 | 인덱스 |
- data 위치의 문자열에서 파라미터의 문자와 같은 첫 번째 인덱스를 반환한다.
- 검색기준은 3가지가 있다.
1. 왼쪽에서 오른쪽으로
var value = "123123";
console.log(value.indexOf(2)); // 값 : 1
console.log(value.indexOf(23)); // 값 : 1
123123에서 `2` 는 두개이지만 처음 인덱스를 반환하므로 1이다.
값을 구하게 되면 더 이상 값을 구하지 않고 끝난다.
23에선 23이 존재하며 23중 처음인 2가 검색된 인덱스를 반환한다.
2. 두 번째 파라미터를 작성하면 그 작성한 인덱스번째부터 검색한다.
var value = "123123";
console.log(value.indexOf(2,3)); //값 : 4
index(2,3) 은 3번 인덱스부터 2를 찾아 검색하는 것이다.
3번째 인덱스부터 2를 찾아 2의 인덱스를 찾으니 값은 4가 된다.
3. 같은 문자가 없으면 -1 을 반환한다. (자주 쓰이는 방법!)
var value = "123123";
console.log(value.indexOf(15)); //값 : -1
indexOf를 사용할때 자주 사용한다. 존재 여부를 체크하기 때문
var value = "123123";
console.log(value.indexOf(2, -1)); //값 : 1
console.log(value.indexOf(2, 9)); //값 : -1
console.log(value.indexOf(2, "A")); //값 : 1
예제 1. 두 번째 파라미터 값이 0보다 작으면 처음부터 검색하므로 1이 나온다.
예제 2. 두 번째 파라미터 값이 length 보다 크면 -1 을 반환한다.
예제 3. 두 번째 파라미터가 NaN이면 처음부터 검색한다.
조건들은 전부 안 외워도 된다. index 번째의 값을 반환한다는 것, 존재하지 않으면 -1을 반환한다는 것. 이것만 기억하자
lastIndexOf()
| 구분 | 데이터(값) |
|---|---|
| data | 검색 대상 |
| 파라미터 | 검색한 문자열 |
| 검색 시작 위치, 디폴트 : 0 | |
| 반환 | 인덱스 |
-
data 위치의 문자열에서 파라미터의 문자와 같은 인덱스를 반환한다.
(단, 뒤에서 앞으로 검색한다.)var value = "123123"; console.log(value.lastIndexOf(2)); //값 : 4마지막 인덱스를 반환하므로 4를 반환한다.
-
검색기준은 2가지 이다.
1. 두 번째 파라미터를 작성하면 작성한 인덱스부터 검색
var value = "1231231";
console.log(value.lastIndexOf(1, 4)); //값 : 3
console.log(value.lastIndexOf(2, -1)); // 값 : -1
예제 1)
인덱스는 왼쪽에서 오른쪽부터 시작한다. 그러나 첫번째 파라미터를 찾을땐 역순이다.
“1231231” 4번째 인덱스 2에서 오른쪽에서 왼쪽으로 이동해 “1231231” 1을 찾음. 고로 3이 반환된다.
예제 2) 두 번째 파라미터가 0보다 작으면 -1을 반환한다.
8. 문자열 연결, 대소문자 변환
concat()
| 구분 | 데이터(값) |
|---|---|
| data | 연결 시작 값, String 인스턴스 |
| 파라미터 | 연결 대상 opt, 다수 작성 가능 |
| 반환 | 연결한 결과 |
- data 위치의 값에 파라미터 값을 작성 순서로 연결하여 문자열로 반환한다.
var result = "sports".concat("축구", 11);
console.log(result); // 값 : sports축구11
var obj = new String(123);
console.log(obj.concat("ABC")); // 값 : 123ABC
String 인스턴스를 작성하면 프리미티브 값을 연결한다.
toLowerCase()
| 구분 | 데이터(값) |
|---|---|
| data | 변환 대상 |
| 파라미터 | 사용하지 않음 |
| 반환 | 변환 결과 |
- 영문 대문자를 소문자로 변환한다.
toUpperCase()
| 구분 | 데이터(값) |
|---|---|
| data | 변환 대상 |
| 파라미터 | 사용하지 않음 |
| 반환 | 변환 결과 |
- 영문 소문자를 대문자로 변환한다.
console.log("CODE".toLowerCase()); // 값 :code
console.log("code".toUpperCase()); // 값 : CODE
문자열 추출 (외울 필요 없다 그냥 알아두면 좋음)
subString()
| 구분 | 데이터(값) |
|---|---|
| data | 반환 대상 |
| 파라미터 | 시작 인덱스 |
| 끝 인덱스 | |
| 반환 | 결과 |
- 파라미터의
시작 인덱스부터끝 인덱스 직전까지 반환한다.
var value = "01234567";
console.log(value.subString(2, 5)); // 값 234
2번 인덱스부터 5번 인덱스 직전(4번 인덱스)까지 반환한다.
-
두번째 파라미터를 작성하지 않으면(끝 인덱스를 작성하지 않으면) 반환 대상의 끝까지 반환한다.
-
파라미터를 모두 작성하지 않으면 전체가 반환된다.
-
다양한 추출 조건을 작성할 수 있다.
- 두번째 파라미터 값(끝 인덱스)이 전체 length 보다 크면 전체 문자열 Length를 사용한다.
따라서 시작 인덱스부터 끝까지 반환한다. - 파라미터 값이 음수이면 0으로 간주한다.
- 첫 번째 파라미터 값(시작 인덱스 값)이 두번째(끝 인덱스 값)보다 크면 파라미터의 값을 뒤바꿔서 처리한다.
- NaN은 0으로 간주한다.
- 두번째 파라미터 값(끝 인덱스)이 전체 length 보다 크면 전체 문자열 Length를 사용한다.
substr()
| 구분 | 데이터(값) |
|---|---|
| data | 반환 대상 |
| 파라미터 | 시작 인덱스 |
| 반환할 문자 수 | |
| 반환 | 결과 |
- 파라미터의 시작 인덱스부터 지정한 문자 수를 반환한다.
var value = "01234567";
console.log(value.substr(0, 3)); 값 : 012
0번 인덱스부터 문자 3개를 반환한다.
- 첫 번째 파라미터 값이 음수이면 length에서 파라미터 값을 더해 시작 인덱스로 사용한다.
var value = "01234567";
console.log(value.substr(-3, 3));
// 값 : 567
첫 번째 파라미터 값이 -3이므로 value의 length 값인 8을 더해 첫 번째 파라미터를 5로 만든다.
5번째 인덱스부터 3개의 문자를 반환하므로 567이 나온다.
- 두 번째 파라미터를 작성하지 않으면 양수 무한대로 간주한다.
양수 무한대는 최대 값이다. 고로 첫 번째 파라미터의 인덱스 값 부터 전체를 반환한다.
첫 번째 파라미터를 작성하지 않으면 0으로 간주하여 아예 전체가 반환된다.
slice()
| 구분 | 데이터(값) |
|---|---|
| data | 반환 대상 |
| 파라미터 | 시작 인덱스 |
| 끝 인덱스 | |
| 반환 | 결과 |
- 파라미터의 시작 인덱스부터 끝 인덱스 직전까지 반환한다.
- 첫 번째 파라미터 값을 작성하지 않거나 NaN이면 0으로 간주한다.
false,undefined,null,빈 문자열은 0으로 간주한다.- 두번째 파라미터를 작성하지 않으면 lenght를 사용한다.
- 값이 음수이면 lenght에 더해 사용한다.
정규 표현식을 사용할 수 있는 함수
match()
| 구분 | 데이터(값) |
|---|---|
| data | 매치 대상 |
| 파라미터 | 정규표현식, 문자열 |
| 반환 | [ 매치결과 ] |
-
매치 결과를
배열로 반환한다. 매치 대상에 정규 표현식의 패턴을 적용하여 매치하고 결과를 반환한다.var value = "Sports"; console.log(value.match(/s/)); // 값 : [s] console.log(value.natch("spo")); // 값 : nullmatch에서
/s/는 정규표현식이다.
한개가 있든 몇개가 있든 배열로 반환하기 때문에 [ s ] 가 반환된 것이다.
“spo”는 소문자 s를 파라미터에 작성했기 때문에(value의 값은 대문자 s로 입력되어 있다.) null이 반환된다.
정규 표현식이란? 🤔
문자열을 패턴으로 매치한다.
패턴(pattern) 형태 : ^,$,*,+ 등
replace()
| 구분 | 데이터(값) |
|---|---|
| data | 치환 대상 |
| 파라미터 | 정규 표현식, 문자열 |
| 대체할 값, 함수 | |
| 반환 | 치환 결과 |
- 매치 결과를 파라미터에 작성한 값으로 대체하여 반환한다.
- 두번째 파라미터에 함수를 작성하면 먼저 함수를 실행하고 함수에서 반환된 값으로 두 번째 파라미터를 대체한다.
var value = "abcabc";
console.log(value.replace("a", "바꿈"));
// 값 : 바꿈bcabc
console.log(value.replace(/a/, "바꿈"));
// 값 : 바꿈bcabc
function change(){
return "함수";
};
console.log(value.replace(/a/, change()));
//값 : 함수bcabc
- /a/는 처음 하나만 바꾸므로 뒤에 있는 a는 변경되지 않는다.
- 함수로 불러오면 함수를 먼저 실행하고 반환된 값으로 바꾼다.
search()
| 구분 | 데이터(값) |
|---|---|
| data | 검색 대상 |
| 파라미터 | 정규표현식, 문자열 |
| 반환 | 매치된 인덱스 |
- 검색된 첫번째 인덱스를 반환한다.
- 매치되지 않으면
-1을 반환한다.
var value = "cbacba";
console.log(value.search(/a/)); // 값 : 2
console.log(value.search("K")); // 값 : -1
두번째 결과는 k가 없으므로 매치되지 않는다. 그러므로 -1을 반환한다.
split()
| 구분 | 데이터(값) |
|---|---|
| data | 분리 대상 |
| 파라미터 | 분리자(separator) : 정규 표현식, 문자열 |
| 반환 수 | |
| 반환 | 결과 |
- 분리 대상을 분리자로 분리하여
배열로 반환한다.
console.log("12_34_56".split("_"));
// 값 : [12, 34, 56]
split 파라미터에 넣은 ‘_’ 을 분리자로 사용하여 분리했다.
분리자는 반환되지 않는다.
- 분리자에 빈 문자열을 작성하면 문자를 하나씩 분리하여 반환한다.
var value = "123" console.log(value.split("")); // 값 : [1,2,3] - 분리자를 아예 작성하지 않으면 분리 대상 전체를 하나의 배열로 반환한다.
console.log("123".split()); //값 : [123] - 두 번째 파라미터에 반환 수를 작성할 경우 그 수만큼 반환된다.
var value = "12_34_56_78"; console.log(value.split("_", 3)); // 값 : [12, 34, 56] value = "123"; console.log(value.split("A")); // 값 : [123]분리자가 대상에 없으면 분리 대상 전체를 하나의 배열로 반환한다.