티스토리 뷰
Number
isFinite : Infinity 또는 -Infinity이면 false, 숫자면 true (형변환x)
isInteger : 정수인지 검사. boolean return (형변환 x)
isNaN : nan이면 true. (형변환x)
toFixed : 숫자를 반올림하여 문자열로 반환. 인수는 소수점 이하 자릿수.(디폴트 0)
toPrecision : 인수로 전달받은 전체 자릿수까지 유효하도록 나머지 자릿수 반올림(디폴트 0)
toString : 숫자를 문자열로 반환. 진법을 인수로 넣을 수 있다.(디폴트 10)
Math
abs 절대값
round 소수점 이하 반올림
ceil 올림
floor 내림
sqrt 루트
random : 0이상 1미만.
pow : (밑, 지수) 거듭제곱 => 지수 연산자 **이용
max : 배열은 apply or spread
min
Date
Date는 생성자 함수다.
Date 생성자 함수로 객체를 생성하는 방법
1. new Date()
현재 시간
2. new Date(milliseconds)
// 한국 표준시 KST는 협정 세계시 UTC에 9시간을 더한 시간이다.
new Date(0); // -> Thu Jan 01 1970 09:00:00 GMT+0900 (대한민국 표준시)
/*
86400000ms는 1day를 의미한다.
1s = 1,000ms
1m = 60s * 1,000ms = 60,000ms
1h = 60m * 60,000ms = 3,600,000ms
1d = 24h * 3,600,000ms = 86,400,000ms
*/
new Date(86400000); // -> Fri Jan 02 1970 09:00:00 GMT+0900 (대한민국 표준시)
3. new Date(dateString)
new Date('May 26, 2020 10:00:00');
// -> Tue May 26 2020 10:00:00 GMT+0900 (대한민국 표준시)
new Date('2020/03/26/10:00:00');
// -> Thu Mar 26 2020 10:00:00 GMT+0900 (대한민국 표준시)
4. new Date(year, month[, day, hour, minute, second, millisecond])
// 월을 나타내는 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 메서드
Date.now : 1970년 1월 1일 00:00:00(UTC)를 기점으로 현재 시간까지 경과한 밀리초
Date.parse : 인수로 전달된 지정 시간까지의 밀리초(new Date(dateString) 형식)
// 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 : 인수로 전달된 지정 시간까지의 밀리초(new Date(year,month`` 형식)
Date.UTC(1970, 0, 2); // -> 86400000
Date.UTC('1970/1/2'); // -> NaN
getFullYear
setFullYear
getMonth (1월이 0, 12월이 11)
setMonth
getDate
setDate
getDay (일요일 0, 토요일 6)
getHours
setHours
getMinutes
setMinuters
getSeconds
setSeconds
getMilliseconds (0~999)
setMilliseconds
getTime (1970년(utc) 기점으로 Date객체의 시간까지 경과된 밀리초를 반환한다.)
setTime
getTimezoneOffset (UTC와 date 객체에 지정된 로캘 시간과의 차이를 분 단위로 반환한다.)
const today = new Date(); // today의 지정 로캘은 KST다.
//UTC와 today의 지정 로캘 KST와의 차이는 -9시간이다.
today.getTimezoneOffset() / 60; // -9
toString, toDateString, toISOString, toLocaleString, toLocaleTimeString
const today = new Date('2020/7/24/12:30');
today.toString(); // -> Fri Jul 24 2020 12:30:00 GMT+0900 (대한민국 표준시)
today.toDateString(); // -> Fri Jul 24 2020
today.toTimeString(); // -> 12:30:00 GMT+0900 (대한민국 표준시)
today.toISOString(); // -> 2020-07-24T03:30:00.000Z
today.toLocaleString(); // -> 2020. 7. 24. 오후 12:30:00
today.toLocaleString('ko-KR'); // -> 2020. 7. 24. 오후 12:30:00
today.toLocaleString('en-US'); // -> 7/24/2020, 12:30:00 PM
today.toLocaleString('ja-JP'); // -> 2020/7/24 12:30:00
today.toLocaleTimeString(); // -> 오후 12:30:00
today.toLocaleTimeString('ko-KR'); // -> 오후 12:30:00
today.toLocaleTimeString('en-US'); // -> 12:30:00 PM
today.toLocaleTimeString('ja-JP'); // -> 12:30:00
시계 ex
(function printNow() {
const today = new Date();
const dayNames = [
'(일요일)',
'(월요일)',
'(화요일)',
'(수요일)',
'(목요일)',
'(금요일)',
'(토요일)'
];
// getDay 메서드는 해당 요일(0 ~ 6)을 나타내는 정수를 반환한다.
const day = dayNames[today.getDay()];
const year = today.getFullYear();
const month = today.getMonth() + 1;
const date = today.getDate();
let hour = today.getHours();
let minute = today.getMinutes();
let second = today.getSeconds();
const ampm = hour >= 12 ? 'PM' : 'AM';
// 12시간제로 변경
hour %= 12;
hour = hour || 12; // hour가 0이면 12를 재할당
// 10미만인 분과 초를 2자리로 변경
minute = minute < 10 ? '0' + minute : minute;
second = second < 10 ? '0' + second : second;
const now = `${year}년 ${month}월 ${date}일 ${day} ${hour}:${minute}:${second} ${ampm}`;
console.log(now);
// 1초마다 printNow 함수를 재귀 호출한다. 41.2.1절 "setTimeout / clearTimeout" 참고
setTimeout(printNow, 1000);
}());
RegExp
정규 표현식은 일정한 패턴을 가진 문자열의 집합을 표현하기 위해 사용하는 형식 언이다.
변수 사용
const target = 'Is this all there is?';
const regexp = new RegExp(/is/i); // ES6
// const regexp = new RegExp(/is/, 'i');
// const regexp = new RegExp('is', 'i');
// const regexp = /is/i;
regexp.test(target); // -> true
RegExp 메서드
exec : 인수로 전달받은 문자열에 대해 정규 표현식의 패턴을 검색하여 매칭 결과를 배열로 반환한다. 없으면 null
test : 인수로 전달받은 문자열에 대해 정규 표현식의 패턴을 검색하여 매칭 결과를 불리언 값으로 반환
String 메서드
match : 대상 문자열과 인수로 전달받은 정규 표현식과의 매칭 결과를 배열로 반환
replace : 바꾸기
search : 대응되는 문자열이 있으면 대응 부분 인덱스, 없으면 -1
split : 정규식 혹은 문자열로 대상 문자열을 나누어 배열로 반환하는 메소드
플래그
i : 대소문자 구별 x
g : 전역 검색
m : 행이 바뀌더라도 계속 검색
특수문자는 모질라 참조
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions
자주 사용하는 정규 표현식
1. 특정 단어로 시작하는지 검사
const url = 'https://example.com';
// 'http://' 또는 'https://'로 시작하는지 검사한다.
/^https?:\/\//.test(url); // -> true
/^(http|https):\/\//.test(url); // -> true
2. 특정 단어로 끝나는지 검사
const fileName = 'index.html';
// 'html'로 끝나는지 검사한다.
/html$/.test(fileName); // -> true
3. 숫자로만 이루어진 문자열인지 검사
const target = '12345';
// 숫자로만 이루어진 문자열인지 검사한다.
/^\d+$/.test(target); // -> true
4. 하나 이상의 공백으로 시작하는 검사
const target = ' Hi!';
// 하나 이상의 공백으로 시작하는지 검사한다.
/^[\s]+/.test(target); // -> true
5. 아이디로 사용 가능한지 검사
const id = 'abc123';
// 알파벳 대소문자 또는 숫자로 시작하고 끝나며 4 ~ 10자리인지 검사한다.
/^[A-Za-z0-9]{4,10}$/.test(id); // -> true
6. 메일 주소 형식에 맞는지 검사
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
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
7. 핸드폰 번호 형식에 맞는지 검사
const cellphone = '010-1234-5678';
/^\d{3}-\d{3,4}-\d{4}$/.test(cellphone); // -> true
8. 특수 문자 포함 여부 검사
const target = 'abc#123';
// A-Za-z0-9 이외의 문자가 있는지 검사한다.
(/[^A-Za-z0-9]/gi).test(target); // -> true
(/[\{\}\[\]\/?.,;:|\)*~`!^\-_+<>@\#$%&\\\=\(\'\"]/gi).test(target); // -> true
target.replace(/[^A-Za-z0-9]/gi, ''); // -> abc123
String
String 메서드
indexOf
search - 정규표현식
includes
startsWith
endWith
charAt
substring
slice : substring과 동일한데 slice는 음수 전달 가능.
const str = 'hello world';
// 인수 < 0 또는 NaN인 경우 0으로 취급된다.
str.substring(-5); // -> 'hello world'
// slice 메서드는 음수인 인수를 전달할 수 있다. 뒤에서 5자리를 잘라내어 반환한다.
str.slice(-5); // ⟶ 'world'
toUpperCase
toLowerCase
trim : 문자열 앞 뒤에 공백문자 제거
repeat
replace :- 정규식도 가능
const str = 'Hello world';
str.replace('world', 'Lee'); // -> 'Hello Lee'
const str = 'Hello Hello';
str.replace(/hello/gi, 'Lee'); // -> 'Lee Lee'
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?"]
Symbol
심벌값은 다른값과 중복되지 않는 유일무이한 값이다.
Symbol.for / Symbol.keyFor 메서드
Symbol.for 메서드는 인수로 전달받은 문자열을 키로 사용하여 키와 심벌 값의 쌍들이 저장되어 있는 전역 심벌 레지스트라에서 해당 키와 일치하는 심벌 값을 검색한다.
// 전역 심벌 레지스트리에 mySymbol이라는 키로 저장된 심벌 값이 없으면 새로운 심벌 값을 생성
const s1 = Symbol.for('mySymbol');
// 전역 심벌 레지스트리에 mySymbol이라는 키로 저장된 심벌 값이 있으면 해당 심벌 값을 반환
const s2 = Symbol.for('mySymbol');
console.log(s1 === s2); // true
Symbol.keyFor 메서드를 사용하면 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출할 수 있다.
// 전역 심벌 레지스트리에 mySymbol이라는 키로 저장된 심벌 값이 없으면 새로운 심벌 값을 생성
const s1 = Symbol.for('mySymbol');
// 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출
Symbol.keyFor(s1); // -> mySymbol
// Symbol 함수를 호출하여 생성한 심벌 값은 전역 심벌 레지스트리에 등록되어 관리되지 않는다.
const s2 = Symbol('foo');
// 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출
Symbol.keyFor(s2); // -> undefined
심벌과 상수
// 위, 아래, 왼쪽, 오른쪽을 나타내는 상수를 정의한다.
// 중복될 가능성이 없는 심벌 값으로 상수 값을 생성한다.
const Direction = {
UP: Symbol('up'),
DOWN: Symbol('down'),
LEFT: Symbol('left'),
RIGHT: Symbol('right')
};
const myDirection = Direction.UP;
if (myDirection === Direction.UP) {
console.log('You are going UP.');
}
enum 흉내
// JavaScript enum
// Direction 객체는 불변 객체이며 프로퍼티는 유일무이한 값이다.
const Direction = Object.freeze({
UP: Symbol('up'),
DOWN: Symbol('down'),
LEFT: Symbol('left'),
RIGHT: Symbol('right')
});
const myDirection = Direction.UP;
if (myDirection === Direction.UP) {
console.log('You are going UP.');
}
심벌과 프로퍼티 키
const obj = {
// 심벌 값으로 프로퍼티 키를 생성
[Symbol.for('mySymbol')]: 1
};
obj[Symbol.for('mySymbol')]; // -> 1
심벌과 표준 빌트인 객체 확장
// 심벌 값으로 프로퍼티 키를 동적 생성하면 다른 프로퍼티 키와 절대 충돌하지 않아 안전하다.
Array.prototype[Symbol.for('sum')] = function () {
return this.reduce((acc, cur) => acc + cur, 0);
};
[1, 2][Symbol.for('sum')](); // -> 3
'책 > 모던 자바스크립트 Deep Dive' 카테고리의 다른 글
모던자바스크립트 10(38장~39장) (브라우저의 렌더링, DOM) (0) | 2021.05.18 |
---|---|
모던자바스크립트 9(34장~37장) (0) | 2021.05.15 |
모던자바스크립트 7(27장) 배열 (0) | 2021.05.11 |
모던자바스크립트 6(25장~26장) (클래스, es6함수) (0) | 2021.04.26 |
모던자바스크립트 5(23장~24장)(실행 컨텍스트, 클로저) (0) | 2021.04.21 |