
- global object는 코드가 실행되기 이전 단계에 자바스크립트 엔진에 의해 어떤 객체보다 먼저 생성되는 특수한 객체
- Node.js 환경에서는 global이 전역 객체이고, 브라우저 환경에서는 window가 전역 객체이다.
- 전역 객체는 계층 구조상 어떤 객체에도 속하지 않는 최상위 객체이다(프로토타입 상속의 의미 X)
1) built in global property
console.log(global.Infinity == Infinity);
console.log(10/0); //양의 무한대
console.log(-10/0) //음의 무한대
console.log(typeof Infinity); //Number
console.log(global.NaN); //global.NaN은 Number.NaN과 같음
console.log(Number('abc'));
console.log(10 * 'abc'); //NaN
console.log(typeof NaN); //number
console.log(global.undefined);
let nothing;
console.log(nothing);
console.log(typeof undefined);
2) built in global function
console.log(isFinite(10)); // true
console.log(isFinite('10')); // true
console.log(isFinite(null)); // true
console.log(isFinite(Infinity)); // false
console.log(isFinite(-Infinity)); // false
console.log(isFinite(NaN)); // false
console.log(isFinite('abc')); // false
console.log(isNaN(NaN)); // true
console.log(isNaN(10)); // false
console.log(isNaN('abc')); // true
console.log(isNaN('10')); // false
console.log(isNaN('')); // false ('' => 0)
console.log(isNaN(true)); // false (true => 1)
console.log(isNaN(false)); // false (false => 0)
console.log(isNaN(undefined)); // true
console.log(isNaN({})); // true
// parseFloat : 전달받은 문자열 인수를 부동 소수점 숫자, 실수로 해석하여 반환
console.log(parseFloat('10.01')); // 10.01
console.log(parseFloat('10')); // 10
// 공백으로 구분 된 문자열은 첫 번째 문자열만 변환
console.log(parseFloat('10 20 30')); // 10
// 숫자가 아닌 문자열은 제외하고 변환
console.log(parseFloat('10cm')); // 10
// 첫 번째 문자열을 숫자로 변환할 수 없다면 변환 불가
console.log(parseFloat('GS25')); // NaN
// 앞뒤 공백은 무시
console.log(parseFloat(' 1004 ')); // 1004
// parseInt : 전달받은 문자열 인수를 정수로 해석하여 반환
console.log(parseInt('10')); // 10
console.log(parseInt('10.01')); // 10
console.log('-------------------------------');
const uri = 'http://greedy.com?name=홍길동&job=student';
const enc = encodeURI(uri);
console.log(enc); // http://greedy.com?name=%ED%99%8D%EA%B8%B8%EB%8F%99&job=student
const dec = decodeURI(enc);
console.log(dec); // http://greedy.com?name=홍길동&job=student
const uriComp = 'name=홍길동&job=student';
const encComp = encodeURIComponent(uriComp);
console.log(encComp); // name%3D%ED%99%8D%EA%B8%B8%EB%8F%99%26job%3Dstudent
// decodeURIComponent
const decComp = decodeURIComponent(encComp);
console.log(decComp); // name=홍길동&job=student
1) Number
const obj = new Number(); // Number 인스턴스 생성
console.log(obj); // 인수 전달하지 않을 경우 0을 할당
const obj2 = new Number(1);
console.log(obj2); // 인수로 전달 받은 숫자 할당
const obj3 = new Number('1');
console.log(obj3); // 인수로 전달 받은 문자 숫자로 형변환
const obj4 = new Number('number');
console.log(obj4); // 숫자 형변환 불가 시 NaN
2) Number-property
console.log(Number.MIN_VALUE);
console.log(Number.MIN_VALUE > 0); // 0보다 크다
console.log(Number.EPSILON); // 1과 1보다 큰 숫자 중에서 가장 작은 숫자와의 차이와 같다
console.log(0.1 + 0.2); // 부동소수점 표현은 2진법으로 변환했을 때 무한소수가 되어 미세한 오차가 발생할 수 밖에 없다
console.log(0.1 + 0.2 === 0.3); // false
console.log(isEqual(0.1 + 0.2, 0.3)); // true
function isEqual(a, b) {
// a - b의 절대값이 Number.EPSILON 보다 작으면 같은 수로 인정한다
return Math.abs(a - b) < Number.EPSILON;
}
3) Number-method
console.log(Number.isFinite(10)); // true
console.log(Number.isFinite(-10)); // true
console.log(Number.isFinite(Infinity)); // false
console.log(Number.isFinite(-Infinity)); // false
console.log(Number.isFinite(NaN)); // false
console.log(Number.isFinite(null)); // false(Number.isFinite(null)에서는 null을 암묵적 타입변환 하지 않기 때문에 유한수로 판단하지 않는다.)
console.log(isFinite(null)); // 빌트인 전역함수 isFinite는 암묵적 타입변환을 한다
console.log(Number.isInteger(10)); // true
console.log(Number.isInteger(-10)); // true
console.log(Number.isInteger(10.10)); // false
console.log(Number.isInteger(-10.10)); // false
console.log(Number.isInteger('10')); // false
console.log(Number.isInteger(false)); // false
console.log(Number.isInteger(Infinity)); // false
console.log(Number.isInteger(-Infinity)); // false
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(undefined)); // false
console.log(isNaN(undefined)); // 빌트인 전역함수 isNaN은 암묵적 타입변환을 한다
console.log(Number.isSafeInteger(10)); // true
console.log(Number.isSafeInteger(1000000000000000000000)); // false
console.log(Number.isSafeInteger(10.10)); // false
console.log(Number.isSafeInteger('10')); // false
console.log(Number.isSafeInteger(false)); // false
console.log(Number.isSafeInteger(Infinity)); // false
console.log((1.23456).toExponential()); // 1.23456e+0
// 소수점 이하로 표현할 자리수 전달한다.
console.log((1.23456).toExponential(3)); // 1.235e+0
console.log((1.23456).toExponential(1)); // 1.2e+0
console.log((1.23456).toFixed()); // 1
console.log((1.23456).toFixed(3)); // 1.235
console.log((1.23456).toFixed(1)); // 1.2
console.log((123.456).toPrecision()); // 123.456
console.log((123.456).toPrecision(5)); // 123.46
console.log((123.456).toPrecision(3)); // 123
console.log((123.456).toPrecision(1)); // 1e+2
console.log((100).toString()); // 100
console.log((100).toString(2)); // 1100100
console.log((100).toString(8)); // 144
console.log((100).toString(16)); // 64
1) Math property
2) Math method
console.log(Math.abs(-10)); // 10
console.log(Math.abs('-10')); // 10
console.log(Math.abs('')); // 0
console.log(Math.abs([])); // 0
console.log(Math.abs(null)); // 0
console.log(Math.abs(undefined)); // NaN
console.log(Math.abs({})); // NaN
console.log(Math.abs('math')); // NaN
console.log(Math.abs()); // NaN
console.log(Math.round(10.1)); // 10
console.log(Math.round(10.9)); // 11
console.log(Math.round(-10.1)); // -10
console.log(Math.round(-10.9)); // -11
console.log(Math.round(10)); // 10
console.log(Math.round()); // NaN
console.log(Math.ceil(10.1)); // 11
console.log(Math.ceil(10.9)); // 11
console.log(Math.ceil(-10.1)); // -10
console.log(Math.ceil(-10.9)); // -10
console.log(Math.ceil(10)); // 10
console.log(Math.ceil()); // NaN
console.log(Math.floor(10.1)); // 10
console.log(Math.floor(10.9)); // 10
console.log(Math.floor(-10.1)); // -11
console.log(Math.floor(-10.9)); // -11
console.log(Math.floor(10)); // 10
console.log(Math.floor()); // NaN
console.log(Math.sqrt(4)); // 2
console.log(Math.sqrt(-4)); // NaN
console.log(Math.sqrt(2)); // 1.4142135623730951
console.log(Math.sqrt(1)); // 1
console.log(Math.sqrt(0)); // 0
console.log(Math.sqrt()); // NaN
console.log(Math.random());
// 1~100 범위의 난수 추출
const random = Math.floor((Math.random() * 100) + 1);
console.log(random);
console.log(Math.pow(2, 2)); // 4
console.log(Math.pow(2, -2)); // 0.25
console.log(Math.pow(2)); // NaN
// ES7에서 도입 된 지수 연산자를 사용할 수 있다
console.log(2 ** 2); // 4
console.log(2 ** -2); // 0.25
console.log(Math.max(10)); // 10
console.log(Math.max(10, 20)); // 20
console.log(Math.max(10, 20, 30)); // 30
// 값을 비교할 요소가 없어서 초기값인 -Infinity 반환
console.log(Math.max()); // -Infinity
console.log(Math.min(10)); // 10
console.log(Math.min(10, 20)); // 10
console.log(Math.min(10, 20, 30)); // 10
console.log(Math.min()); // Infinity
1) Date
console.log(new Date(0));
// 하루가 지난 만큼의 millisecond 인자로 전달
console.log(new Date(24 * 60 * 60 * 1000));
console.log(new Date('Jul 26, 2022 09:00:00'));
console.log(new Date('2022/07/26/09:00:00'));
console.log(new Date(2022, 1)); //UTC 기준(KST는 + 9시간으로 22-02-01) 2022-01-31T15:00:00.000Z
console.log(new Date(2022, 1, 1, 9, 0, 0, 0)); //2022-02-01T00:00:00.000Z
2) Date method
const now = Date.now();
console.log(now);
console.log(new Date(now));
console.log(Date.parse('Jan 1, 1970 09:00:00')); //KST 0
console.log(Date.parse('Jan 1, 1970 09:00:00 UTC')); //UTC 32400000
console.log(Date.parse('1970/01/01/09:00:00'));
console.log(Date.parse('1970/01/01/09:00:00 UTC'));
console.log(Date.UTC(1970, 0, 1));
console.log('------------------------');
// 연, 월, 일, 시, 분, 초, 밀리초 반환 및 설정
const date = new Date();
console.log(date.getFullYear());
console.log(date.getMonth());
console.log(date.getDate());
console.log(date.getDay()); // 일요일부터 월요일을 0~6으로 반환
console.log(date.getHours());
console.log(date.getMinutes());
console.log(date.getSeconds());
console.log(date.getMilliseconds());
date.setFullYear(2020);
date.setMonth(0);
date.setDate(1);
date.setHours(9);
date.setMinutes(10);
date.setSeconds(10);
date.setMilliseconds(10);
console.log(date);
console.log('------------------------');
const date2 = new Date();
console.log(date2.getTime());
date2.setTime(5 * 24 * 60 * 60 * 1000);
console.log(date2);
const today = new Date();
console.log(today.getTimezoneOffset());
console.log(today.getTimezoneOffset() / 60);
console.log(today.toString()); //Thu Feb 09 2023 12:49:01 GMT+0900 (대한민국 표준시)
console.log(today.toDateString()); //Thu Feb 09 2023
console.log(today.toTimeString()); //12:49:01 GMT+0900 (대한민국 표준시)
console.log(today.toISOString()); //2023-02-09T03:49:01.530Z
console.log(today.toLocaleString()); //2023. 2. 9. 오후 12:49:01
console.log(today.toLocaleTimeString()); //오후 12:49:01
1) RegExp
const target = 'JavaScript';
regexp = new RegExp('j', 'i');
regexp = new RegExp(/j/, 'i');
regexp = new RegExp(/j/i); //ES6부터 가능한 표현
2) RegExp method
const target = 'Java JavaScript';
console.log(/va/.exec(target));
console.log(/va/g.exec(target)); // 문자열 내의 모든 패턴을 검색하는 g 플래그를 지정해도 첫 번째 매칭 결과만 반환
console.log(/hello/.exec(target)); // 매칭 결과가 없을 경우 null 반환
const target = 'Java JavaScript';
console.log(/va/.test(target));
console.log(/hello/.test(target));
console.log(target.match(/va/));
console.log(target.match(/va/g)); // 문자열 내의 모든 패턴을 검색하는 g 플래그를 지정하면 모든 매칭 결과가 배열로 반환
console.log(target.match(/hello/));
3) flag and patterns
let target = "Java JavaScript";
console.log(target.match(/VA/));
console.log(target.match(/VA/i));
console.log(target.match(/VA/ig));
패턴
let target = "Java JavaScript";
target = 'abcdefg';
console.log(target.match(/../g)); // 임의의 두자리 문자열 전역 검색
target = 'a aa aaa b bb bbb ab aab abb';
console.log(target.match(/a{2,3}/g)); // a 최소 2번 ~ 최대 3번 반복
console.log(target.match(/b{2}/g)); // b 두 번 반복
console.log(target.match(/b{3,}/g)); // 3번 이상 반복
console.log(target.match(/b{1,2}/g));
console.log(target.match(/b+/g));
target = 'soul seoul';
// 중간의 e 문자가 있어도 되고 없어도 되는 패턴 검색
console.log(target.match(/se?oul/g)); //soul, seoul
target = 'aa bb cc dd 123 456 _@';
console.log(target.match(/a|b/g));
// 분해 되지 않은 단어 레벨로 검색
console.log(target.match(/a+|b+/g));
// [] 내의 문자는 or로 동작
console.log(target.match(/[abc]+/g));
// 범위를 지정하려면 - 사용
console.log(target.match(/[a-z]+/g));
// 대소문자 범위
console.log(target.match(/[A-Za-z]+/g));
// 숫자범위
console.log(target.match(/[0-9]+/g));
console.log(target.match(/[^0-9]+/g));
console.log(target.match(/[^a-z]+/g));
target = 'https://www.google.com';
// 주소값에 다른 문자열이 포함 되었을 때, ^ 혹은 $ 없이 검색하면 포함하는 경우를 검색하여 true를 반환하므로
// 시작 위치와 마지막 위치를 정확하게 검색해야 함
console.log(/^https/.test(target));
console.log(/com$/.test(target));
4) example
const url = 'https://www.googl.com';
console.log('=====================');
console.log(/^https?:\/\//.test(url));
// 파일 확장자가 js인지 검사
const fileName = 'test.js';
console.log(/js$/.test(fileName));
// const target = '12345'; true
const target = '123*45'; //false
// 처음과 끝이 숫자이고 최소 한 번 이상 반복 되는 문자열과 매칭
console.log(/^\d+$/.test(target));
// 알파벳 대소문자 또는 숫자로 시작하고 끝나며 6~12 자리인지 검사
const id = 'hello123';
console.log(/^[A-Za-z\d]{6,12}$/.test(id));
const phone = '010-1234-5678';
console.log(/^\d{3}-\d{3,4}-\d{4}$/.test(phone));
const target2 = 'hello#world';
console.log(/[^A-Za-z0-9가-힣]/.test(target2));
1) String
const obj = new String();
console.log(obj); // 인수 전달하지 않으면 빈 문자열을 할당한 객체 생성
const obj2 = new String('홍길동');
console.log(obj2); // 인수로 문자열 전달 시 전달 받은 문자열 할당
const obj2 = new String('홍길동');
console.log(obj2.length);
console.log(obj2[0]);
obj2[0] = '김'; // 에러는 발생하지 않음
console.log(obj2);
const obj3 = new String(100);
const obj4 = new String(null);
console.log(obj3[0]);
console.log(obj4[0]);
2) String method
const obj = new String('홍길동');
console.log(Object.getOwnPropertyDescriptors(obj)); // writable : false 새롭게 값 입력 불가(읽기 전용)
console.log('--------------------------------');
const str = 'JavaScript';
console.log(str.indexOf('a')); // 문자열에서 a 검색하여 첫번째 인덱스 반환
console.log(str.indexOf('b')); // 검색에 실패하면 -1 반환
console.log(str.indexOf('a', 2)); // 검색 시작 인덱스 지정
// 특정 문자열 존재 유무 확인에 사용
if(str.indexOf('a') !== -1) console.log('a가 있다');
console.log('--------------------------------');
console.log(str.includes('a')); // 문자열에서 a 검색하여 포함 여부 반환
console.log(str.includes('b')); // 검색에 실패하면 false 반환
console.log(str.includes('a', 2)); // 검색 시작 인덱스 지정
// 특정 문자열 존재 유무 확인에 사용
if(str.includes('a')) console.log('a가 있다');
console.log('--------------------------------');
console.log(str.search(/a/));
console.log(str.search(/b/)); // 검색에 실패하면 -1 반환
console.log('--------------------------------');
console.log(str.startsWith('Ja'));
console.log(str.startsWith('va', 2)); // 검색 시작 인덱스 지정
console.log(str.endsWith('pt'));
console.log(str.endsWith('va', 4)); // 'Java'가 va로 끝나는지(endsWith(찾을문자, 끝나는 인덱스))
console.log('--------------------------------');
for(let i = 0; i < str.length; i++)
console.log(str.charAt(i));
console.log(str.substring(1,4)); // 두번째 인덱스 위치 바로 이전 문자까지
console.log(str.substring(1)); // 두번째 인수 생략 시 문자열 끝까지
console.log(str.substring(4,1)); // 인수 교환하여 기능
console.log(str.substring(-1)); // 음수는 0으로 취급
console.log(str.substring(1,20)); // length보다 크면 length로 취급
console.log(str.slice(1,4)); // substring 동일
console.log(str.slice(1)); // substring 동일
console.log(str.slice(4,1)); // 인수 교환하여 기능하지 않음
console.log(str.slice(-1)); // 음수는 뒤에서부터
console.log(str.slice(1,20)); // substring 동일
const str2 = ' JavaScript ';
console.log(str2.trim());
console.log(str.repeat()); // 빈 문자열
console.log(str.repeat(0)); // 빈 문자열
console.log(str.repeat(1));
console.log(str.repeat(2));
console.log(str.repeat(2.5)); // 실수는 정수로 처리
// console.log(str.repeat(-1)); // 음수는 에러 RangeError: Invalid count value
console.log(str.replace('Java', 'Type'));
console.log(str.replace('a', 'b')); // 검색 된 문자열이 여럿 존재할 경우 첫번째로 검색된 문자열만 치환
console.log(str.replace(/j/i,'Z')); // 첫번째 인수로 정규표현식 전달
const str3 = 'Hello, Everyone! Nice to see you again.';
console.log(str3.split(' ')); // 공백을 구분하여 배열로 반환
console.log(str3.split('')); // 인수로 빈 문자열을 전달하면 각 문자를 모두 분리
console.log(str3.split()); // 인수를 생략하면 문자열 전체를 단일 요소로 하는 배열 반환
console.log(str3.split(' ', 5)); // 공백문자로 자르고 배열의 길이 지정