Primise
- async 키워드를 사용하면 Promise 객체를 반환한다.
- Promise 객체는 .then() 혹은 await 로 접근이 가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
let pm = new Promise(function (success, fail){
var v = 1 + 1;
setTimeout(function(){
success(v);
},5000)
});
// then : 성공 시, catch : 실패 시
pm.then(function(v){
console.log(`result : ${v}`)
}).catch(function(){
console.log('연산 실패')
})
// then()
async function add1(){
return 2 + 1
}
add1().then(function(res){
console.log(`result : ${res}`)
})
async function add2() {
let promise = new Promise((resolve, reject) => {
let res = 1 + 6;
resolve(res);
})
promise.then((res) => console.log(`result : ${res}`))
}
add2();
// await
async function add3() {
let promise = new Promise((resolve, reject)=>{
let result = 6 + 6;
resolve(result);
})
result = await promise;
console.log("add3 : ",result)
}
add3(); // add3 : 12
// promise 실패 시
async function add4(){
let promise = new Promise((resolve, reject)=> {
reject();
})
try {let result = await promise }
catch { console.log('rejected') };
}
add4();
class() constructor, prototype
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class 부모 {
constructor(이름, 나이){
this.name = 이름;
this.age = 나이;
}
sayHi(){
console.log('hello')
}
sayHello(){
console.log('안녕하세요');
}
}
var 자식 = new 부모('Park', 30);
console.log(자식);
console.log(Object.getPrototypeOf(자식)) // 부모 object 반환
console.log(자식.__proto__); // 부모 object 반환
console.log(Object.getPrototypeOf(자식) === 자식.__proto__) // true
function test(name, price) {
this.name = name;
this.price = price;
this.vat = function (){
console.log(`vat is ${this.price * 0.1}`)
}
}
test.prototype.test = 'ttt'; // prototype 에 속성 test 추가
let a = new test('kim', 10000);
let b = new test('oh', 30000);
console.log(a);
a.vat(); // vat is 1000
console.log('a.prototype : '+a.test) // a.prototype : ttt
console.log('b.prototype : '+b.test) // b.prototype : ttt
console.log(a.__proto__) // test 객체 반환
console.log(test.prototype === a.__proto__) // true
var 부모 = { name : 'Kim' };
var 자식 = {};
자식.__proto__ = 부모; // 자식의 부모 유전자는 { name : 'Kim' } 이라는 오브젝트가 되버림.
console.log(자식.name); // kim
// ES5 : create(부모) : 상속
var 부모1 = { name : 'Kim', age : 50 };
var 자식1 = Object.create(부모1); // 자식이라는 object는 부모를 prototype으로 두게 된다.
console.log(자식1);
console.log(자식1.age); // 50
var 부모2 = { name : 'Kim', age : 50 };
var 자식2 = Object.create(부모2);
자식2.age = 20;
console.log(자식2.age); // 20
var 부모 = { name : 'Kim', age : 50 };
var 자식 = Object.create(부모);
자식.age = 20;
var 손자 = Object.create(자식);
console.log(손자.age); // 20
Destructuring (구조분해)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// Array 안에 있는 데이터를 변수에 담는 방법
var array = [2,3,4];
var [a,b,c] = array;
console.log(a,b,c) // 2, 3, 4
var [a,b,c = 5] = [2,3];
console.log(a,b,c) // 2, 3, 5
// Object 안에 있는 데이터를 변수에 담는 방법
let obj = { name : 'Kim', age : 30 };
let {name : aa, age : bb} = obj;
console.log('aa : ', aa) // Kim
console.log('bb : ', bb) // 30
// 이렇게 key값과 value값이 동일하면 name 이렇게 하나로 생략이 가능.
var name = 'Kim';
var age = 30;
var ob = { name, age }
console.log('ob : ', ob) // {name : 'Kim', age = 30}
// example of destructuring
function 함수( { name, age }){
console.log(name, 20);
}
var obj2 = { name : 'Kim', age : 20 };
함수(obj2); // Kim, 20
function 함수2( [name, age] ){
console.log(name, age);
}
var array = [ 'Kim', 30 ];
함수2( ['Kim', 30] ); // Kim, 30
let 신체정보 = {
body: {
height: 190,
weight: 70
},
size: ["상의 Large", "바지 30인치"],
};
let {
body: {
height,
weight
},
size: [ 상의, 하의 ]
} = 신체정보;
for in - 객체
- enumerable(열거, 셈이 가능한) : true 인 것들만 for in 반복문으로 돌릴 수 있음.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
let obj = {name : 'oh', age: 30};
console.log(Object.getOwnPropertyDescriptor(obj, 'name'));
Object.defineProperty(obj, 'name', {enumerable : false});
console.log(Object.getOwnPropertyDescriptor(obj, 'name'));
for (const key in obj) {
console.log(obj[key]) // 속성 name 을 enumerable false 로 줬기 때문에, enumerable 값이 true 인 age 의 값 30 만 출력.
}
class parents {}
parents.prototype.name = 'Park';
let object = new parents();
for (const key in object) {
if (object.hasOwnProperty(key)) {
console.log('object : ', object[key]); // 출력 x
}
if (object.__proto__.hasOwnProperty(key)) {
console.log('object2 : ', object.__proto__[key]); // prototype 이 name 속성을 가지고 있으므로 object2 가 출력된다.
}
}
for of - 배열, 문자, arguments, NodeList, Map, Set
- iterable(반복 가능한) 인 자료형들에만 적용가능한 반복문
- iterable한 자료형 : Symbol.iterator 이라는 일종의 메소드를 가지고 있는 자료형
- for of 는 nodeList에서 사용 가능.
- NodeList : document.getElementsByClassName()이나 document.querySelectorAll() 으로 찾은 요소들.
- [] 대괄호안에 담겨오는데 array는 아니고 NodeList라는 자료형이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var arr = [2,3,4,5];
console.log( 'arr[Symbol.iterator]() : ',arr[Symbol.iterator]() );
var products = [
{
name1 : 'chair',
price1 : 7000,
},
{
name2 : 'sofa',
price : 5000,
},
{
name1 : 'desk',
price3 : 9000,
},
];
for (let product of products) {
for ( let key in product) {
let reg = /[0-9]/;
// key 에 숫자가 들어있다면,
if(reg.test(key)){
// key 생성후 제거.
product[key.slice(0,-1)] = product[key];
delete product[key];
}
}
}
console.log(products); // 키에 숫자가 제거된 객체로 변환되었다.
// 마지막글자를 숫자로변환했을 때 NaN이 안나오면 (숫자면)
// if (isNaN(parseInt(key.slice(-1))) == false ) {
Map, Set
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var person = new Map();
person.set('age', 20);
person.get('age');
person.delete('age'); //자료 삭제
person.size;
//Map자료 반복문 돌리기
for (var key of person.keys() ){
console.log(key)
}
//자료를 직접 집어넣고 싶으면
var person = new Map([
['age', 20],
['name', 'Kim']
]);
// set : 특히 Array의 데이터 중복제거할 때 많이 사용.
var 출석부2 = new Set([ 'john' , 'tom', 'andy', 'tom' ]);
출석부2.add('sally'); // 자료더하기
출석부2.has('tom'); // 자료있는지 확인
출석부2.size; // 자료 몇갠지 세기
// 중복제거 => array -> set, set -> array;
var 출석부 = [ 'john' , 'tom', 'andy', 'tom' ];
var 출석부2 = new Set(출석부); // Array를 Set으로 바꾸기
console.log(출석부2)
console.log(typeof 출석부2)
출석부 = [...출석부2] // Set을 Array로 바꾸기
Spread Operator (전개연산자) - 괄호제거 해주는 연산자
- spread 연산자는 함수소괄호, 오브젝트 중괄호내, 어레이 대괄호내에서 보통 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
var arr = ['hello', 'world'];
console.log(arr); // array
console.log(...arr); // hello world
var char = 'hello';
console.log(char[0]); // 문자 array처럼 출력 가능.
console.log(char[1]);
console.log(char) // hello
console.log(...char) // h e l l o
// -------------- 1. 배열 합치기/복사 --------------
let a = [1,2,3];
let b = [4,5];
let c = [...a, ...b];
console.log(c) // [1,2,3,4,5]
console.log(...c) // 1 2 3 4 5
let d = [1,2];
let e = d; // * 복사가 잘 되지만 d와 e는 값을 공유하게 됨.
console.log(d)
console.log(e)
d.push(3)
console.log(e);
let aa = [...a]; // 전개연산자로 복사하면 주소를 공유하지 않는다.
aa.push(77)
console.log(a) // [1,2,3]
console.log(aa) // [1,2,3,77]
// -------------- 2. 객체 합치기/복사 --------------
var o1 = { a : 1, b : 2 };
var o2 = { c : 3, ...o1 };
console.log(o2); // { c:3, a:1, b:2 }
var o3 = { a : 1, b : 2};
var o4 = { a : 3, ...o3 };
console.log(o4); // {a: 1, b: 2} : a라는 값이 중복이 발생하면 무조건 뒤에 오는 a가 적용.
// -------------- 3. 배열을 함수 파라미터에 넣을 때 --------------
function add (a,b,c) {
console.log(a + b + c);
}
let nums = [1,2,3];
add(...nums); // 6
function addAll(...rest) {
let sum = 0;
console.log(typeof rest) // object
console.log(typeof rest[3]) // number
for (value of rest) {
sum += value
}
console.log('sum : ', sum)
}
addAll(1,2,3,4,10)
let data = {
odd : [],
even : [],
setter : (...rest) => {
[...rest].filter((v) => {
v % 2 === 0 ? data.even.push(v) : data.odd.push(v);
})
console.log(data.odd, data.even);
}
}
data.setter(1, 2, 3, 4, 5, 6, 7);
Symbol()
- Object자료형에 비밀스런 key값을 부여하고싶을 때 사용. 반복문에서 감지 못함.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var person = {name : 'jeonggil'};
person.weight = 70;
var weight = Symbol('real weight');
person[weight] = 200; // 키, 벨류로 저장. Symbol(real weight) : 200
console.log(person)
// Object 자료형에 직접 입력하실 때는 저렇게 대괄호안에 심볼명을 담아 저장.
var height = Symbol('my height');
var person = {name : 'ojg', [height] : 180};
console.log(person)
var a = Symbol('ex');
var b = Symbol('ex');
console.log(a === b); // false : Symbol()이라고 사용할 때마다 각각 유니크한 Symbol이 생성
var a = Symbol.for('ex2');
var b = Symbol.for('ex2');
console.log(a === b); // true : 설명이 같으면 이미 그 설명을 가지고 있는 Symbol을 그 자리에 집어넣음.
Tagged Literal
- 백틱을 사용해서 함수를 실행한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var 변수 = '손흥민';
function 해체분석기(문자들, 변수들){
console.log(문자들);
console.log(변수들);
}
// `문자열`을 이용해서 실행
해체분석기`안녕하세요 ${변수} 입니다`;
function 해체분석기2(문자들, 변수들){
console.log(문자들[1] + 변수들);
}
해체분석기2`안녕하세요 ${변수} 입니다`;
// tagged literal : 첫째파라미터로 모든 글자들을 받아와서 Array에 담고, 나머지 파라미터에는 변수가 담김.
var pants = 20;
var socks = 100;
// 1.
function analize(chars, vars1, vars2) {
// console.log(chars)
// console.log(vars1)
// console.log(vars2)
console.log(chars[1] + vars2+ chars[0] + vars1)
}
console.log(`--- 바지${pants}양말${socks}`);
analize`바지${pants}양말${socks}`;
// 2. 해체분석기`바지${pants} 양말${socks}` : pants라는 변수가 0인 경우 -> `바지다팔렸어요 양말100` 출력.
function analize2(chars, var1, var2) {
if (var1 === 0) {
console.log('바지다팔림 ' + chars[1] + var2)
} else {
console.log(chars[0] + var1 + chars[1] + var2);
}
}
analize2`바지${pants}양말${socks}`;
// shadow, dinosaur