빌트인 오브젝트
값이 있으면 true로 인식
false 인식 기준
숫자 값 변환 기준
Boolean 인스턴스 생성
파라미터 값을 true 또는 false로 변환하여 프리미티브에 설정
//value의 모든 값이 false로 변환되며 생성한 Boolean 인스턴스의 프리미티브 값으로 설정
var value = [undefined, null, NaN, 0, ""];
for (var k = 0; k < value.length; k++){
var obj = new Boolean(value[k]);
log(obj + 1);
};
// 1
// 1
// 1
// 1
// 1
var value = [12, "1", "0", "false"]; // value의 모든 값이 true로 변환
for (var k = 0; k < value.length; k++){
var obj = new Boolean(value[k]);
log(obj + 1);
};
// 2
// 2
// 2
// 2
Boolean 값으로 변환
인스턴스를 생성하지 않고 true 또는 false로 변환
var value = [12, "1", "0", "false"];
for (var k = 0; k < value.length; k++){
log(Boolean(value[k]) + 1);
};
// 2
// 2
// 2
// 2
var result = true.toString();
log(result);
log(typeof result);
// true
// string
var obj = new Boolean(3);
log(obj.valueOf());
// true
자바스크립트는 스크립팅(Scripting)언어
스크립팅 언어 특징
var value = 123;
var book = function(){
var point = 456;
var getPoint = function(){
return point;
};
getPoint();
};
book();
객체 지향 프로그래밍 언어 ➡ OOP(Object Oriented Programming)
자바스크립트는 객체 지향 언어
자바스크립트 OOP 구현
객체
객체를 형상화하면
클래스(Class)
var book = {
read: function(param){코드}
};
JS의 OOP 구현 방법
prototype에 연결하여 작성
var Book = function(){};
Book.prototype.getBook = function(){ //prototype이 오브젝트이므로 {이름: 메소드} 형태로 연결
return "JS북";
};
다른 언어는 class 안에
자바스크립트는 prototype에
class Book {
constructor(title) {
this.title = title;
}
getBook(){
return this.title;
}
}
Instance
인스턴스 목적
인스턴스를 생성하여 반환
파라미터
var Book = function(point){
this.point = point;
};
Book.prototype.getPoint = function(){
return this.point + 100;
};
var oneInstance = new Book(200);
log(oneInstance.getPoint());
// 300
오브젝트로 생성한 인스턴스 여부 반환
instance가 object로 생성한 인스턴스이면 true, 아니면 false 반환
var Book = function(point){
this.point = point;
};
Book.prototype.getPoint = function(){
return this.point + 100;
};
var oneInstance = new Book(200);
log(oneInstance instanceof Book);
// true
데이터 형태
OOP의 일반적인 형태
var data = ["book", "책", 123];
var obj = new Array();
var result = obj.concat(data);
log(result);
// [book, 책, 123]
1) 데이터로 메소드 호출
var data = ["book", "책", 123];
var result = data.concat();
log(result);
// [book, 책, 123]
2) 오브젝트의 함수 호출
var data = ["book", "책", 123];
var bookObj = {
concat: function(data){
return data.concat();
}
};
log(bookObj.concat(data));
// [book, 책, 123]
3) 인스턴스의 메소드 호출
var data = ["book", "책", 123];
var Book = function(data){
this.data = data;
};
Book.prototype.concat = function(){
return this.data.concat();
};
var oneInstance = new Book(data);
log(oneInstance.concat());
// [book, 책, 123]
메소드를 알 수 없을 때
메소드를 알고 있을 때
ES5 Object에 함수가 추가됨
빌트인 Object의 모든 메소드는
함수는 첨부되지 않으므로 연결 부하를 줄일 수 있음
대상 오브젝트에 프로퍼티 추가 또는 프로퍼티 속성 변경
프로퍼티마다 상태를 갖고 있음
var obj = {};
Object.defineProperty(obj, "book", {
value: "JS북",
enumerable: true
});
log(obj);
// {book: JS북}
var obj = {};
Object.defineProperties(obj, {
soccer: {
value: "축구", enumerable: true
},
basketball: {
value: "농구", enumerable: true
}
});
for (var name in obj){
log(name + ":" + obj[name]);
};
// soccer:축구
// basketball:농구
프로퍼티의 속성 이름과 속성 값을 정의
디스크립터 타입 분류
먼저 value 또는 writable 작성 체크
작성되어 있으면
작성되어 있지 않으면
데이터와 악세스 프로퍼티 디스크립터를 함께 작성할 수 없으므로 구분 가능
var obj = {};
Object.defineProperty(obj, "book", {
value: "JS북",
enumerable: true
});
for (var name in obj){
log(name);
log(obj[name]);
}
// book
// JS북
var obj = {};
Object.defineProperty(obj, "book", {
value: "JS북",
// get: function(){}
});
//
프로퍼티 값 변경 가능, 불가
writable: true
var obj = {};
Object.defineProperty(obj, "book", {
value: "JS책",
writable: true
});
obj.book = "변경 가능";
log(obj.book);
// 변경 가능
var obj = {};
Object.defineProperty(obj, "book", {
value: "JS책",
writable: false
});
obj.book = "변경 불가";
log(obj.book);
// JS책
for~in으로 열거 가능 여부
enumerable: true
var obj = {};
Object.defineProperty(obj, "book", {
value: "JS책",
enumerable: true
});
for (var name in obj){
log(name, ":" + obj[name]);
};
// book:JS북
var obj = {};
Object.defineProperty(obj, "book", {
value: "JS책",
enumerable: false
});
for (var name in obj){
log(name, ":" + obj[name]);
};
//
프로퍼티 삭제 가능, 불가
configurable: true
var obj = {};
Object.defineProperty(obj, "book", {
value: "JS책",
configurable: true
});
delete obj.book;
log(obj.book);
// undefined
var obj = {};
Object.defineProperty(obj, "book", {
value: "JS책",
configurable: false
});
delete obj.book;
log(obj.book);
// JS북
getter
var result = obj.book; 코드를 만나면
var obj = {};
Object.defineProperty(obj, "book", {
get: function(){
return "JS책";
}
});
var result = obj.book;
log(result);
// JS책
setter
obj.book = "JS책"; 코드를 만나면
obj.book; 코드를 만나면
var obj = {}, data = {};
Object.defineProperty(obj, "book", {
set: function(param){
data.title = param;
},
get: function(){
return data.title;
}
});
obj.book = "JS책";
log(obj.book);
// JS책
function Book(point){
this.point = point;
};
Book.prototype.getPoint = function(){};
Book.prototype.setPoint = function(){};
var obj = new Book(100);
var result = Object.getPrototypeOf(obj);
for (var key in result){
log(key + ":" + result[key]);
};
// getPoint:function(){}
// setPoint:function(){}
오브젝트의 프로퍼티 이름을 배열로 반환
열거 가능 여부를 체크하지 않음
자신이 만든 프로퍼티가 대상
var obj = {};
Object.defineProperties(obj, {
book: {value: "책"},
point: {value: 123}
});
var names = Object.getOwnPropertyNames(obj);
for (var k = 0; k < names.length; k++){
log(names[k]);
};
// book
// point
var obj = {};
Object.defineProperties(obj, {
book: {
value: "책", enumerable: true
},
point: {value: 123} // enumerable: false이므로 반환하지 않음
});
var names = Object.keys(obj);
for (var k = 0; k < names.length; k++){
log(names[k]);
};
// book
var obj = {};
Object.defineProperty(obj, "book", {
value: "책",
writable: true, enumerable: true
});
var desc = Object.getOwnPropertyDescriptor(obj, "book");
for (var key in desc){
log(key + ":" + desc[key]);
};
// value:책
// writable:true
// enumerable:true
// configurable:false
오브젝트에 프로퍼티 추가 금지 설정
프로퍼티 삭제, 변경은 가능
추가 금지를 설정한 후에는 추가 가능으로 변경 불가
var obj = {};
Object.preventExtensions(obj);
try {
Object.defineProperty(obj, "book", {
value: "책"
});
} catch (e) {
log("추가 불가");
};
// 추가 불가
var obj = {};
Object.defineProperty(obj, "book", {
value: "책",
});
log(Object.isExtensible(obj));
Object.preventExtensions(obj);
log(Object.isExtensible(obj));
// true
// false
오브젝트에 프로퍼티 추가, 삭제 금지 설정
추가 금지는 오브젝트 단위로 설정하고, 삭제 금지는 프로퍼티 단위로 설정
추가 금지를 하더라도 변경은 가능
var obj = {};
OBject.defineProperty(obj, "book", {
value: "책", writable: true
});
Object.seal(obj);
try {
Object.defineProperty(obj, "sports", {
value: "스포츠"
});
} catch(e) {
log("추가 불가");
};
// 추가 불가
var obj = {};
Object.defineProperty(obj, "book", {
value: "책", writable: true
});
log(Object.isSealed(obj));
Object.seal(obj);
log(Object.isSealed(obj));
// false
// true
var obj = {};
OBject.defineProperty(obj, "book", {
value: "JS책", writable: true
});
Object.freeze(obj);
try {
Object.defineProperty(obj, "book", {
value: "포인트"
});
} catch(e) {
log("변경 불가");
};
log(obj.book);
// 변경 불가
// JS책
var obj = {};
Object.defineProperty(obj, "book", {
value: "책", writable: true
});
log(Object.isFrozen(obj));
Object.freeze(obj);
log(Object.isFrozen(obj));
// false
// true
JavaScript Object Notation
JSON 주요 기능
JS 데이터 타입 지원
JS 타입을 JSON 타입의 문자열로 변환
첫 번째 파라미터
var value = {
book: "책",
title: 123
};
var result = JSON.stringfy(value);
log(result);
// {"book":"책", "title":123}
var value = ['book', '책', 123];
var result = JSON.stringfy(value);
log(result);
// ["book","책",123]
log(JSON.stringfy([Infinity, NaN, null]));
log(JSON.stringfy([true, false]));
// [null, null, null]
// [true, false]
log(JSON.stringfy(undefined));
log(JSON.stringfy([undefined]));
log(JSON.stringfy({value: undefined));
// undefined
// [null]
// {}
var data = {book: '책', point: 55};
function relpace(key, value){
return key === "point" ? 11 : value;
};
var result = JSON.stringfy(data, replace);
log(result);
// {"book":"책","point":11}
var data = {book:'책', point: 11, amount: 90};
var result = JSON.stringfy(data, ['book', 'amount']);
log(result);
// {"book":"책","amount":90}
var data = {sports:'soccer', time: 90};
var result = JSON.stringfy(data, "", '\n');
log(result);
/*
{
"sports":"soccer",
"time":90
}
*/
var data = {sports:'soccer', time: 90};
var result = JSON.stringfy(data, "", 4); // 4만큼 들여쓰기
log(result);
/*
{
"sports":"soccer",
"time":90
}
*/
var data = {sports:'soccer', time: 90};
var result = JSON.stringfy(data, "", "##");
log(result);
/*
{
##"sports":"soccer",
##"time":90
}
*/
JSON 타입을 JS 타입으로 변환
작성 주의
/*
JSON 형태는 기본적으로 큰따옴표 사용
즉, String 타입이지만 JSON.parse()에서 JS 타입에 맞도록 변환
"123"은 문자열이지만 값이 숫자이므로 Number 타입의 숫자로 변환
파싱 대상이 서버에서 받은 데이터일 때, try-catch 사용 필수
*/
var value = "123";
try {
var result = JSON.parse(value);
} catch(e){
console.log("JSON 파싱 에러");
};
log(result);
log(typeof result);
// 123
// number
// try-catch 원래는 사용해야 함!
var value = "true";
var result = JSON.parse(value);
log(result);
log(typeof result);
// true
// boolean
var value = '["ABC", "가나", "12"]'; // 배열에 작성된 String 타입의 숫자는 숫자로 변환 안함
var result = JSON.parse(value);
log(result);
// ["ABC", "가나", "12"]
var value = '{"point": "123"}';
var result = JSON.parse(value);
log(result);
// {point: "123"}
// JS는 프로퍼티 이름에 큰따옴표 사용하지 않으므로 큰따옴표 표시되지 않음
var data = '{"book": "책", "movie": "영화"}';
var check = function(key, value){
return key === "book" ? "JS책" : value;
};
var result = JSON.parse(data, check);
log(result);
// {book: "JS책", movie: "영화"}
첫 번째 파라미터의 JSON 문자열을 파싱하면
파싱한 오브젝트를 하나씩 읽어가면서 두 번째 파라미터의 함수를 실행
함수에서 값을 반환하면 파싱 결과인 result 변수에 반영
값을 반환하지 않거나 undefined를 반환하면 프로퍼티가 제외되므로 반환해야 함
년월일, 시분초, 밀리초 제공
UTC(Universal Time Coordinated) 기준
UTC와 GMT(Greenwich Mean Time)
JS는 UTC 기준
월은 0부터 시작
일은 1에서 31일까지 정수로 표시
요일은 0부터 시작
var obj = new Date(1970, 1, 1, 1, 1, 1, 1);
log(obj.toLocaleString());
// 1970. 2. 1. 오전 1:01:01
var obj = new Date(2019, 02);
log(obj);
// Fri Mar 01 2019 00:00:00 GMT+0900 (한국 표준시)
// 값을 작성하지 않으면 0으로 간주
log(new Date());
// Sun Jul 28 2019 04:40:45 GMT+0900 (한국 표준시)
log(new Date("2019-02"));
// Fri Feb 01 2019 09:00:00 GMT+0900 (한국 표준시)
/*
문자열 작성의 차이
new Date(2019, 02)에서 02가 3월로 변환되지만
new Date("2019-02")는 2월로 변환됨
*/
log(new Date(2019, 11, 34));
// Fri Jan 03 2020 00:00:00 GMT+0900 (한국 표준시)
/*
월일시분초 범위를 넘치면 상위 시간값에 반영됨
단, 문자열로 작성하면 에러
new Date(2019, 11, 34)에서 34가 31을 넘치므로 3을 남겨두고 11에 1을 더함
12는 13월이므로 1을 남겨두고 2019에 1을 더함
따라서 2020.01.03
*/
log(Date.now());
log(new Date()); // 같은 시간값이지만 값 표시가 다름
// 1564256664242
// Sun Jul 28 2019 04:44:24 GMT+0900 (한국 표준시)
log(Date.parse("2019-01-23T09:11:23.123"));
// 1548202283123
var obj = new Date(2019, 02, 15);
log(obj.getMonth());
log(obj.getDate());
// 2
// 15
var obj = new Date();
log(obj.valueOf());
log(obj.setMonth(01));
log(obj.setDate(15));
// 1564256773401
// 1551296773401
// 1550173573401
주의사항
수학 계산용 오브젝트
new 연산자로 인스턴스 생성 불가
메소드가 아니라 함수
log(Math.abs(-123));
log(Math.abs(-Infinity));
// 123
// Infinity
log(Math.floor(5, 3));
log(Math.floor(-1.7));
log(Math.floor(-1.0));
// 5
// -2
// -1
log(Math.ceil(5.1));
log(Math.ceil(-1.7));
log(Math.ceil(-0.3));
// 6
// -1
// 0
소수 이하 반올림, 정숫값 반환
양수이면 반올림, 음수이면 반내림
log(Math.round(5.1));
log(Math.round(5.5));
log(Math.round(-1.6));
log(Math.round(-1.3));
// 5
// 6
// -2
// -1
파라미터 값 중에서 가장 큰 값을 반환
파라미터 값을 전부 숫자로 변환하여 비교
log(Math.max(5, 3, 9));
log(Math.max(5, 3, "AB"));
// 9
// NaN
파라미터 값 중에서 가장 작은 값을 반환
파라미터 값을 전부 숫자로 변환하여 비교
log(Math.min(5,3, 9));
log(Math.min(5, 3, "AB"));
// 3
// NaN
파라미터가 x값의 y승 값을 반환
y가 0일 때 x가 NaN라도 1을 반환
y가 NaN이면 NaN 반환
이처럼 경우의 수가 많으므로 사용하기 전에 테스트 필요
log(Math.pow(10, 2));
log(Math.pow(10, 0));
log(Math.pow("A", 1));
log(Math.pow(1, "A"));
log(Math.pow(1)); // 두 번째 파라미터 안 쓰면 NaN
// 100
// 1
// NaN
// NaN
// NaN
log(Math.random());
log(Math.random());
// 0.583434121236421
// 0.883472304023923