💡 래퍼객체
래퍼객체란 원시 타입에 대응되는 객체이다.
원시값에 내장메서드를 이용하게되면 잠시 객체 값으로 임시변환해주는데 이를 래퍼객체라고 한다.(new + 생성자함수로 직접 생성할 수도 있다.)
내장메서드를 사용할때 순간적으로 사용했다가 사라진다.
new 연산자와 함께 호출하면 [[NumberData]]
내부 슬롯에 0을 할당한 Number 래퍼 객체를 생성한다.
-> 만약 생성자 함수의 인수로 숫자를 전달한다면 인수로 전달받은 숫자를 할당한 객체를 생성한다.
-> 인수로 숫자가 아닌 값을 전달하면 숫자로 강제변환한다. 숫자가 아니라면 NAN
이 저장된다.
const numObj1 = new Number();
console.log(numObj1); // Number {[[PrimitiveValue]]: 0}
const numObj2 = new Number(10);
console.log(numObj2); // Number {[[PrimitiveValue]]: 10}
let numObj3 = new Number('10');
console.log(numObj3); // Number {[[PrimitiveValue]]: 10}
numObj3 = new Number('Hello');
console.log(numObj3); // Number {[[PrimitiveValue]]: NaN}
Number.EPSILON
Number.MAX_VALUE
Infinitiy
이다.Number.MIN_VALUE
Number.MAX_SAFE_INTEGER
Number.MIN_SAFE_INTEGER
Number.POSITIVE_INFINITY
Infinity
와 같다.Number.NEGATIVE_INFINITY
-Infinity
와 같다.Number.NaN
window.NaN
와 같다.Number.isFinite
isFinite
와 차이가 있다. -> Number.isFinite는 숫자가 아니면 무조건 false isFinite는 암묵적 타입변환을 시행해줌.Number.isFinite(0); // -> true
Number.isFinite(Number.MAX_VALUE); // -> true
Number.isFinite(Infinity); // -> false
Number.isInteger
Number.isInteger(123) // -> true
Number.isInteger('123') // -> false
Number.isInteger(Infinity) // -> false
Number.isNaN
isNaN
과 차이가 있다. 빌트인 함수는 전달받은 인수를 숫자로 암묵적 타입변환을 진행한다.isNaN
은 undefined의 경우 true를 뿜는다.Number.isSafeInteger
-(2^53 - 1) < x < 2^53 - 1
x가 안전한 정수다.Number.prototype.toExponential
(77.1234).toExponential(); // -> "7.71234e+1"
(77.1234).toExponential(4); // -> "7.7123e+1"
(77.1234).toExponential(2); // -> "7.71e+1"
77.toExponential(); // -> SyntaxError: Invalid or unexpected token
77 .toExponential(); // -> "7.7e+1"
Number.prototype.toFixed
// 소수점 이하 반올림. 인수를 생략하면 기본값 0이 지정된다.
(12345.6789).toFixed(); // -> "12346"
// 소수점 이하 1자리수 유효, 나머지 반올림
(12345.6789).toFixed(1); // -> "12345.7"
// 소수점 이하 2자리수 유효, 나머지 반올림
(12345.6789).toFixed(2); // -> "12345.68"
Number.prototype.toPrecision
(12345.6789).toPrecision(); // -> "12345.6789"
// 전체 1자리수 유효, 나머지 반올림
(12345.6789).toPrecision(1); // -> "1e+4"
// 전체 2자리수 유효, 나머지 반올림
(12345.6789).toPrecision(2); // -> "1.2e+4"
Number.prototype.toString
(10).toString(); // -> "10"
// 2진수 문자열을 반환한다.
(16).toString(2); // -> "10000"
// 8진수 문자열을 반환한다.
(16).toString(8); // -> "20"
수학적인 상수와 함수를 위한 프로퍼티와 메서드를 제공한다. Math는 생성자 함수가 아니기 때문에 정적 프로퍼티와 정적 메서드만 제공한다.
Math.PI
는 원주율 PI값을 반환한다.
Math.PI; // -> 3.141592653589793
Math.abs
Math.abs(-1); // -> 1
Math.abs(''); // -> 0
Math.abs([]); // -> 0
Math.abs(null); // -> 0
Math.abs(undefined); // -> NaN
Math.abs({}); // -> NaN
Math.abs('string'); // -> NaN
Math.abs(); // -> NaN
Math.round
Math.round(1.4); // -> 1
Math.round(1.6); // -> 2
Math.round(-1.4); // -> -1
Math.ceil
Math.floor
Math.sqrt
Math.sqrt(9); // -> 3
Math.sqrt(-9); // -> NaN
Math.sqrt(2); // -> 1.414213562373095
Math.random
0 <= x < 1
Math.random();
Math.pow
Math.pow(2, 8); // -> 256
Math.pow(2, -1); // -> 0.5
// ES7 지수 연산자
2 ** 2 ** 2; // -> 16
Math.max
전달받은 인수 중 가장 큰 수를 반환한다.(인수를 전달하지 않으면 -Infinity 반환)
배열을 인수로 전달받는 방법도 있다.
Math.max(1); // -> 1
Math.max(1, 2); // -> 2
Math.max(1, 2, 3); // -> 3
// 배열 요소 중에서 최대값 취득
Math.max.apply(null, [1, 2, 3]); // -> 3
// ES6 스프레드 문법
Math.max(...[1, 2, 3]); // -> 3
Math.min
Date는 날짜와 시간을 위한 메서드를 제공하는 빌트인 객체이면서 생성자 함수이다.
UTC(협정 세계시)는 국제 표준시, GMT(그리니치 평균시)로 불리기도 한다. KST(한국 표준시간)은 UTC에 9시간을 더한 시간이다.
현재 날짜와 시간은 코드가 실행된 시스템의 시계에 의해 결정된다.
new Date()
new Date(); // -> Mon Jul 06 2020 01:03:18 GMT+0900 (대한민국 표준시)
Date(); // -> "Mon Jul 06 2020 01:10:47 GMT+0900 (대한민국 표준시)"
new Date(milliseconds)
new Date(86400000); // -> Fri Jan 02 1970 09:00:00 GMT+0900 (대한민국 표준시)
new Date(dateString)
Date.parse
메서드에 의해 해석가능한 형식이어야한다.new Date('May 26, 2020 10:00:00');
// -> Tue May 26 2020 10:00:00 GMT+0900 (대한민국 표준시)
new Date(year, month[,day, hour, minute, second, millisecond])
연,월,일,시,분,초,밀리초를 인수로 전달하면 지정된 날짜와 시간을 나타내는 객에를 반환한다.
연, 월은 필수이며 지정하지 않은 옵션은 0 또는 1로 초기화한다.
// 월을 나타내는 2는 3월을 의미한다. 2020/3/1/00:00:00:00
new Date(2020, 2);
// -> Sun Mar 01 2020 00:00:00 GMT+0900 (대한민국 표준시)
// 월을 나타내는 2는 3월을 의미한다. 2020/3/26/10:00:00:00
new Date(2020, 2, 26, 10, 00, 00, 0);
// -> Thu Mar 26 2020 10:00:00 GMT+0900 (대한민국 표준시)
// 다음처럼 표현하면 가독성이 훨씬 좋다.
new Date('2020/3/26/10:00:00:00');
// -> Thu Mar 26 2020 10:00:00 GMT+0900 (대한민국 표준시)
Date.now
Date.parse
기준시간을 기점으로 인수로 전달된 지정시간까지의 밀리초를 숫자로 반환한다.
// UTC
Date.parse('Jan 2, 1970 00:00:00 UTC'); // -> 86400000
// KST
Date.parse('Jan 2, 1970 09:00:00'); // -> 86400000
// KST
Date.parse('1970/01/02/09:00:00'); // -> 86400000
Date.UTC
Date.prototype.getFullYear
Date.prototype.setFullYear
Date.prototype.getMonth
Date.prototype.setMonth
Date.prototype.getDate
Date.prototype.setDate
Date.prototype.getDay
Date.prototype.getHours
Date.prototype.setHours
Date.prototype.getMinutes
Date.prototype.setMinutes
Date.prototype.getSeconds
Date.prototype.setSeconds
Date.prototype.getMilliseconds
Date.prototype.setMilliseconds
Date.prototype.getTime
Date.prototype.setTime
Date.prototype.getTimezoneOffset
UTC와 Date 객체에 지정된 로캘 시간과의 차이를 분 단위로 반환한다.
const today = new Date(); // today의 지정 로캘은 KST다.
//UTC와 today의 지정 로캘 KST와의 차이는 -9시간이다.
today.getTimezoneOffset() / 60; // -9
Date.prototype.toDateString
Date.prototype.toTimeString
Date.prototype.toISOString
Date.prototype.toLocaleString
인수로 전달한 로캘을 기준으로 Date 객체의 날짜와 시간을 표현한 문자열을 반환한다.
인수가 생략되면 동작 중인 시스템의 로캘을 적용한다.
const today = new Date('2020/7/24/12:30');
today.toString(); // -> Fri Jul 24 2020 12:30:00 GMT+0900 (대한민국 표준시)
today.toLocaleString(); // -> 2020. 7. 24. 오후 12:30:00
today.toLocaleString('ko-KR'); // -> 2020. 7. 24. 오후 12:30:00
💡 정규 표현식(regular expression)
일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식언어.
문자열을 대상으로 패턴 매칭 기능을 제공한다.(특정 패턴과 일치하는 문자열을 검색하거나 추출, 치환 가능한 기능)
반복문과 조건문 없이 패턴을 정의하고 테스트하는 것으로 간단히 체크할 수 있다.
주석이나 공백을 허용하지 않고 여러가지 기호를 혼합하여 사용하기 때문에 가독성이 좋지 않다는 문제가 있다.
정규 표현식 리터럴
과 RegExp 생성자 함수
를 사용해 생성할 수 있다.
정규 표현식 리터럴
은 패턴과 플래그로 구성된다.
const target = 'Is this all there is?';
// 패턴: is
// 플래그: i => 대소문자를 구별하지 않고 검색한다.
const regexp1 = /is/i;
// ES6의 RegExp 생성자 함수 이용
const regexp2 = new RegExp(/is/i); // ES6
// test 메서드는 target 문자열에 대해 정규표현식 regexp의 패턴을 검색하여 매칭 결과를 불리언 값으로 반환한다.
regexp1.test(target); // -> true
regexp2.test(target); // -> true
RegExp.prototype.exec
const target = 'Is this all there is?';
const regExp = /is/;
regExp.exec(target); // -> ["is", index: 5, input: "Is this all there is?", groups: undefined]
RegExp.prototype.test
인수로 전달받은 문자열에 대해 정규 표현식의 패턴을 검색하여 매칭 결과를 불리언 값으로 반환한다.
const target = 'Is this all there is?';
const regExp = /is/;
regExp.test(target); // -> true
String.prototype.match
대상 문자열로 인수로 전달받은 정규표현식과의 매칭결과를 배열로 반환한다.
g 플래그를 지정하면 모든 매칭결과를 배열로 반환한다.
const target = 'Is this all there is?';
const regExp = /is/;
target.match(regExp); // -> ["is", index: 5, input: "Is this all there is?", groups: undefined]
const regExp2 = /is/g;
target.match(regExp2); // -> ["is", "is"]
패턴과 함께 정규 표현식을 구성하는 플래그는 정규 표현식의 검색 방식을 설정하기 위해 사용한다.
총 6개가 있다.
i
g
m
문자열의 일정한 규칙을 표현하기 위해 사용한다.
/
로 열고 닫으며 문자열의 따옴표는 생략한다. 따옴표를 포함한다면 따옴표도 패턴에 포함된다.
임의의 문자열 검색
. 은 임의의 문자 한 개를 의미한다.
const target = 'Is this all there is?';
// 임의의 3자리 문자열을 대소문자를 구별하여 전역 검색한다.
const regExp = /.../g;
target.match(regExp); // -> ["Is ", "thi", "s a", "ll ", "the", "re ", "is?"]
반복 검색
{m,n}은 최소 m번, 최대 n번 반복되는 문자열을 의미한다.
{n}은 {n,n}과 같다.
{n,}은 최소 n번 이상 반복되는 문자열을 의미한다.
+
는 {1,}와 같다.
?
는 {0,1}과 같다.
콤마 뒤에 공백이 있으면 정상 동작하지 않으므로 주의해야한다.
const target = 'A AA B BB Aa Bb AAA';
// 'A'가 최소 1번, 최대 2번 반복되는 문자열을 전역 검색한다.
const regExp = /A{1,2}/g;
target.match(regExp); // -> ["A", "AA", "A", "AA", "A"]
const target2 = 'color colour';
// 'colo' 다음 'u'가 최대 한 번(0번 포함) 이상 반복되고 'r'이 이어지는 문자열 'color', 'colour'를 전역 검색한다.
const regExp2 = /colou?r/g;
target2.match(regExp2); // -> ["color", "colour"]
OR 검색
|
은 or의 이미를 갖는다.[]
내의 문자는 or로 동작한다[]
내에 -
를 사용한다.[\d]
는 숫자를 의미한다.( = [0-9]
)[\D]
는 숫자가 아닌 문자를 의미한다.[\w]
는 알파벳, 숫자, 언더스코어를 의미한다.( = [A-Za-z0-9_]
)[\W]
는 알파벳, 숫자, 언더스코어가 아닌 문자를 의미한다.NOT 검색
^
은 not의 의미를 가진다[^0-9]
는 숫자를 제외한 문자를 의미힌다.시작 위치로 검색
[]
밖의 ^
은 문자열의 시작을 의미한다.const target = 'https://poiemaweb.com';
// 'https'로 시작하는지 검사한다.
const regExp = /^https/;
regExp.test(target); // -> true
마지막 위치로 검색
$
는 문자열의 마지막을 의미한다.const target = 'https://poiemaweb.com';
// 'com'으로 끝나는지 검사한다.
const regExp = /com$/;
regExp.test(target); // -> true
아이디로 사용 가능한지 검사
알파벳 대소문자, 숫자로 시작하고 끝나며 4~10자리인지 검사
const id = 'abc123';
// 알파벳 대소문자 또는 숫자로 시작하고 끝나며 4 ~ 10자리인지 검사한다.
/^[A-Za-z0-9]{4,10}$/.test(id); // -> true
메일 주소 형식에 맞는지 검사
인터넷 메시지 형식 규약인 RFC 5322에 맞는 정교한 패턴 매칭이 필요하다면 매우 복잡하다.
아래는 위 형식과 맞지는 않다.
const email = 'ungmo2@gmail.com';
/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/.test(email); // -> true
핸드폰 번호 형식에 맞는지 검사
const cellphone = '010-1234-5678';
/^\d{3}-\d{3,4}-\d{4}$/.test(cellphone); // -> true
특수 문자 포함 여부 검사
const target = 'abc#123';
// A-Za-z0-9 이외의 문자가 있는지 검사한다.
(/[^A-Za-z0-9]/gi).test(target); // -> true
표준 빌트인 객체인 String 객체는 생성자 함수 객체다.
String 생성자 함수에 인수를 전달하지 않고 new
와 함게 호출하면 [[SrringData]]
내부 슬록에 빈 문자열을 할당한 String 래퍼 객체를 생성한다.
유사배열 객체이면서 이터러블이므로 인덱스를 사용하여 각문자에 접근이 가능한다.
String 객체에는 원본 래퍼 객체를 직접 변경하는 메서드는 존재하지 않는다.
String 객체의 메서드는 언제나 새로운 문자열을 반환한다.
문자열은 변경불가능한 값이기 때문에 String 래퍼 객체도 읽기 전용 객체로 제공된다.
String.prototype.indexOf
대상 문자열에서 인수로 전달받은 문자열을 검색하여 첫 번째 인덱스를 반환한다.
검색 실패 시 -1 을 반환한다.
두 번째 인수로 검색을 시작할 인덱스를 전달할 수 있다.
const str = 'Hello World';
// 문자열 str에서 'l'을 검색하여 첫 번째 인덱스를 반환한다.
str.indexOf('l'); // -> 2
// 문자열 str에서 'or'을 검색하여 첫 번째 인덱스를 반환한다.
str.indexOf('or'); // -> 7
// 문자열 str의 인덱스 3부터 'l'을 검색하여 첫 번째 인덱스를 반환한다.
str.indexOf('l', 3); // -> 3
String.prototype.search
인수로 전달 받은 정규 표현식과 매치하는 문자열을 검색하여 일치하는 문자열의 인덱스를 반환한다.
검색 실패 시 -1 을 반환한다.
const str = 'Hello world';
// 문자열 str에서 정규 표현식과 매치하는 문자열을 검색하여 일치하는 문자열의 인덱스를 반환한다.
str.search(/o/); // -> 4
str.search(/x/); // -> -1
String.prototype.includes
String.prototype.startsWith
String.prototype.endsWith
String.prototype.charAt
String.prototype.substring
첫번째 인수(시작 인덱스) ~ 두번째 인수(끝 인덱스) 전 까지의 부분 문자열을 반환한다.
두번째 인수를 생략하면 문자열의 끝까지로 인식한다.
첫번째 인수가 두번째 인수보다 크면 교환된다.
0보다 작거나 NaN인 경우 0으로 취급한다.
const str = 'Hello World';
// 인덱스 1부터 마지막 문자까지 부분 문자열을 반환한다.
str.substring(1); // -> 'ello World'
str.substring(4, 1); // -> 'ell'
str.substring(-2); // -> 'Hello World'
str.substring(1, 100); // -> 'ello World'
str.substring(20); // -> ''
String.prototype.slice
String.prototype.toUpperCase
String.prototype.toLowerCase
String.prototype.trim
String.prototype.repeat
String.prototype.replace
첫 번째 인수로 전달받은 문자열 또는 정규표현식을 검색하여 두 번째 인수로 전달한 문자열로 치환한 문자열을 반환한다.
검색된 문자열이 여럿 존재할 경우 첫 번째로 검색된 문자열만 치환한다.
const str = 'Hello world world';
str.replace('world', 'Lee'); // -> 'Hello Lee world'
String.prototype.split
첫 번째 인수로 전달한 문자열 또는 정규 표현식을 검색하여 문자열을 구분한 후 분리된 각 문자열로 이루어진 배열을 반환한다.
인수로 빈 문자열을 전달하면 각 문자를 모두 분리한다.
인수를 생략하면 문자열 전체를 단일 요소로하는 배열을 반환한다.
두 번째 인수로 배열의 길이를 지정할 수 있다.
const str = 'How are you doing?';
// 공백으로 구분(단어로 구분)하여 배열로 반환한다.
str.split(' '); // -> ["How", "are", "you", "doing?"]
// \s는 여러 가지 공백 문자(스페이스, 탭 등)를 의미한다. 즉, [\t\r\n\v\f]와 같은 의미다.
str.split(/\s/); // -> ["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?"]