조건문을 사용하면 특정 조건이 만족됐을 때 특정 코드를 실행할 수 있다.

 

if문

가장 기본적인 조건문은 if문이다.

if문은, "~한다면 ~~를 해라"를 의미한다

예시

const a = 1;
if (a + 1 === 2) {
  console.log('a + 1 이 2 입니다.');
}

결과는 "a+1이 2입니다."이 출력된다.

하지만 여기서 a를 0으로 바꾸면

const a = 0;
if (a + 1 === 2) {
  console.log('a + 1 이 2 입니다.');
}

결과는 아무것도 출력되지 않는다.

if문을 사용하면, 이렇게 특정 조건이 만족 될 때에만 특정 코드를 실행 시킬수 있다.

if (조건) {
  코드;
}

조건이 만족 됐을떄 샐행 시킬 코드가 {}로 감싸져있는데 이것을 코드 블록이라고 한다.

만약 조건이 true가 된다면 지정한 코드가 실행되고 false가 된다면 코드가 실행되지 않는다.

let 과 const는 다른 블록 범위에서는 똑같은 이름으로 선언 할수 있다.

다음코드를 한번 보자

 

const a = 1;
if (true) {
  const a = 2;
  console.log('if문 안의 a 값은 ' + a);
}
console.log('if문 밖의 a 값은 ' + a);

이코드는 if문에 조건을 true로 설정했기 때문에 코드 블록 내부의 코드가 무조건 실행이 된다.

결과는 다음과 같다

"if문의 안의 a 값은 2"
"if문 밖의 a 값은 1"

if-else문

if-else문은 "~~하다면~~하고,그렇지 않다면 ~~해라."를 의미한다.

예시코드

const a = 10;
if (a > 15) {
  console.log('a 가 15 큽니다.');
} else {
  console.log('a 가 15보다 크지 않습니다.');
}

위코드의 결과

"a 가 10보다 크지 않습니다."

특정 조건이 만족할 때와 만족하지 않을 때 서로 다른 코드를 실행해야 된다면 if-else구문을 사용할수 있다.

 

if-else if 문

if-else if문은 여러 조건에 따라 다른 작업을 해야 할 때 사용합니다.

예시 코드를 보자.

const a = 10;
if (a === 5) {
  console.log('5입니다!');
} else if (a === 10) {
  console.log('10입니다!');
} else {
  console.log('5도 아니고 10도 아닙니다.');
}

결과

"10입니다!"

한번 a값을 5로 바꾸고 실행해보고, 7로 바꾸고 실행해보면.

a = 5 -> "5입니다!"
a = 7 -> "5도 아니고 10도 아닙니다."

switch/case문

switch/case 문은 특정 값이 무엇이냐에 따라 다른 작업을 하고 싶을 때 사용

예시

const device = 'iphone';

switch (device) {
  case 'iphone':
    console.log('아이폰!');
    break;
  case 'ipad':
    console.log('아이패드!');
    break;
  case 'galaxy note':
    console.log('갤럭시 노트!');
    break;
  default:
    console.log('모르겠네요..');
}

device값을 'iphone', 'ipad','galaxy note','macbook'순서대로 바꿔가면서 코드를 실행해보자.

device값에 따라서 다른 결과가 출력된다.

switch/case문은 이와 같이 특정 값이 무엇이냐에 따라 다른 작업을 수행할수 있게 해준다.

switch/case문에서는 각 case에서 실행할 코드를 작성하고 맨 마지막에 break;를 해줘야 한다. break를 하지않으면 그 다음 case의 코드까지 실행해 버린다.

맨 아래의 default는 device값이 case로 준비하지 않은 값일 경우를 의미한다.

'공부내용정리 > JavaScript' 카테고리의 다른 글

객체  (0) 2021.04.14
함수  (0) 2021.04.13
연산자  (0) 2021.04.10
변수와 상수  (0) 2021.04.10
JavaScript Async - Await  (0) 2021.04.08
  • 산술 연산자

산술연산자는 사칙연산과 같은 작업을 하는 연산자를 의미한다

  • + : 덧셈
  • - : 뺄셈
  • * : 곱셈
  • / : 나눗셈

위 4가지가 가장 기본적인 산술 연산자이다.

let a = 1 + 2;
console.log(a);

let a = 1 + 2 - (3 * 4) / 4;
console.log(a);

이런것도 가능하다. 이것 또한 산술연산자의 일부이다.

let a = 1;
a++;
++a;
console.log(a);

결과는 3이 나타납니다. ++는 특정 변수에 1을 바로 더해준다. 그런데, ++가 변수 이름 앞에 오는것과 뒤에 오는것에는 차이가 있다

let a = 1;
console.log(a++);
console.log(++a);

console.log(a++);를 할때는 1을 더하기 직전 값을 보여주고

console.log(++a);를 할때는 1을 더한 다음의 값을 보여준다는 차이가 있다.

덧셈 외에도 뺄셈도 똑같이 할수 있다.

let a = 1;
a--;
console.log(a);

결과는 0 이 나온다.

 

대입 연산자

대입 연산자는 특정 값에 연산을 한 값을 바로 설정 할 때 사요 할 수 있는 연산자 입니다. 예를 들어서 다음과 같은코드가 있다면

let a = 1;
a = a + 3;

위 코드를 대입 연산자를 사용하면 다음과 같이 작성 가능하다.

let a = 1;
a += 3;

덧셈 말고 다른 연산도 가능하다.

let a = 1;
a += 3;
a -= 3;
a *= 3;
a /= 3;
console.log(a);

결과는 1이 나타나게 됩니다.

 

논리 연산자

논리 연산자는, 불리언 타입(true 혹은 false)를 위한 연산자이다. 논리 연산자는 다음 장에서 우리가 if문을 배울 때 매우 유용하다.

총3가지가 있다.

  • ! : NOT
  • & : AND
  • || : OR

NOT

NOT 연산자는 true는 false로, false는 true로 바꿔준다.

const a = !true;
console.log(a);

a의 값은 false이다.

const b = !false;
console.log(b);

b값은 true가 된다.

AND

AND 연산자는 양쪽의 값이 둘다 true일때만 결과물이 true 이다.

const a = true && true;
console.log(a);

다음과 같은 상황엔 모두 false이다

let f = false && false;
f = false && true;
f = true && false;

OR

OR 연산자는 양쪽의 값 중 하나라도 true라면 결과물이 true이다. 그리고, 두값이 둘다 false일 때에만 false이다.

다음 상황엔 t값은 true이다.

let t = true || false;
t = false || true;
t = true || true;

반면에 다음 상황엔 false이다

let f = false || false;

연산 순서

사칙연산을 할떄 곱셈 나눗셈이 먼저고 그 다음이 덧셈 뺼셈인 것 처럼, 논리 연산자도 순서가 있다. 순서는 NOT -> AND -> OR 이다. 예를 들어 다음과 같은 코드가 있다고 가정해 보자.

const value = !((true && false) || (true && false) || !false);

괄호로 감싸져 있을떄는 가장 마지막에 처리를 하니까 맨 앞 NOT은 나중에 처리한다.

우선 NOT을 처리한다.

!((true && false) || (true && false) || true);

그 다음엔 AND를 처리한다.

!(false || false || true);

or 연산자를 좌측에서 우측 방향으로 처리를 하게 되면서 다음과 같이 처리된다.

!true;

결국 결과값은 false가 된다.

비교 연산자

비교 연산자는 두값을 비교 할떄 사용 할수 있다.

 

두 값이 일치 하는지 확인

const a = 1;
const b = 1;
const equals = a === b;
console.log(equals);

===는 두 값이 일치 하는지 확인해 준다. 일치한다면, true 일치하지 않는다면 false가 나타난다. 위 코드의 경우엔 true가 나타난다.

두 값이 일치 하는지 확인 할떄 =를 3번 사용하는데, 2개로도 비교를 할수는 있다.

const a = 1;
const b = 1;
const equals = a == b;
console.log(equals);

==와 ===의 차이점은 ==는 타입검사 까지는 하지 않는다는 것이다.

예를 들어 == 를 사용하면 숫자 1과 문자'1'이 동일한 값으로 간주된다.

const a = 1;
const b = '1';
const equals = a == b;
console.log(equals);

결과 : true

그리고, 0과 false도 같은 값으로 간주 된다.

const a = 0;
const b = false;
const equals = a == b;
console.log(equals);

결과 : true;

 

그리고 undefined와 null도 같은 값으로 간주된다.

const a = null;
const b = undefined;
const equals = a == b;
console.log(equals);

결과 : true;

 

따라서 ==보단 ===를 사용하는것이 실수를 줄일수가 있어서 ===를 더 추천한다.

 

두 값이 일치하지 않는지 확인

두 값이 일치하지 않는지 확인 할떄는 !==를 사용하면 된다.

const value = 'a' !== 'b';

결과는 true가 된다

!=를 사용하면 타입 검사를 하지 않는다.

console.log(1 != '1');
console.log(1 !== '1');

!==를 사용하는것을 추천한다.

 

크고 작음

두 값 중에서 무엇이 더 크고 작은지 비교하기 위해서 다음 연산자를 사용할수 있다.

const a = 10;
const b = 15;
const c = 15;

console.log(a < b); // true
console.log(b > a); // true
console.log(b >= c); // true
console.log(a <= c); // true
console.log(b < c); // false;

 

문자열 붙이기

두 문자열을 붙일 떄에는 + 로 할 수 있다

const a = '안녕';
const b = '하세요';
console.log(a + b); // 안녕하세요

'공부내용정리 > JavaScript' 카테고리의 다른 글

함수  (0) 2021.04.13
조건문  (0) 2021.04.12
변수와 상수  (0) 2021.04.10
JavaScript Async - Await  (0) 2021.04.08
JavaScript Promise  (0) 2021.04.08

변수와 상수는, 특정 이름에 특정값을 담을때 사용한다.

예를들어 value 라는 이름에 1이라는 값을 넣는다고 가정하면

let value = 1;

이렇게 입력하면 된다.

이걸 출력할려면

let value = 1;
console.log(value);

이렇게 나온다.

 

변수

변수는, 바뀔수 있는 값을 말한다. 한번 값을 선언하고 바꿀수 있다

let value = 1;
console.log(value);
value = 2;
console.log(value);

변수 선언할떄는 let이라는 키워드를 사용한다. 주의점은 한번 선언했으면 같은 이름으로 선언하지 못한다

let value = 1;
let value = 2;

단 다른 블록 범위 내에서는 같은 이름으로 사용이 가능하다.

 

상수

상수는 한번 선언하고 값이 바뀌지 않는 값을 의미한다. 

상수선언 방식

const a = 1;

상수 선언할떄는 const를 사용한다. 상수를 선언하고 나면 값을 바꿀수 없다

const a = 1;
a = 2;

한번 선언하면 값을 바꿀수 없음을 의미 한다.

상수를 선언할 때도 마찬가지로 한번 선언했으면 같은이름으로 선언할수 없다.

const a = 1;
const a = 2;

이미 선언되었다고 나온다.

 

var는 더 이상 사용하지 말자.

var와 let의 차이는 똑같은 이름을 여러번 선언할수 있다는것이다.

 

데이터 타입

숫자(Number)

let value = 1;

문자열(String)

텍스트 형태의 값은 작은 따옴표 또는 큰 따옴표로 감싸서 선언한다.

let text = 'hello';
let name = '좌봐스크립트';

참/거짓(Boolean)

참혹은 거짓 (true/false)를 나타낼떄 사용함

let good = true;
let loading = false;

null과 undefined

자바스크립트에서는 "없음"을 의미하는 데이터 타입이 두종류가 있는데, 하나는 null이고 하나는 undefined이다

null은 주로 이값이 없다 라고 선언을 할때 사용한다.

const friend = null;

반면에 undefined는 아직 값이 설정되지 않은 것을 의미한다.

let criminal;
console.log(criminal);

criminal이라는 변수를 선언했는데 값을 지정해주지는 않아서 출력해주면 undefined가 나온다.

null과 undfined는 둘다 값이 없음을 의미하는건 맞는데, null은 우리가 없다고, 고의적으로 설정하는 값을 의미하고, undefined는 우리가 설정을 하지 않았기 때문에 없는 값을 의미한다.

'공부내용정리 > JavaScript' 카테고리의 다른 글

조건문  (0) 2021.04.12
연산자  (0) 2021.04.10
JavaScript Async - Await  (0) 2021.04.08
JavaScript Promise  (0) 2021.04.08
JavaScript 클래스  (0) 2021.04.07

developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/async_function

 

 

async function - JavaScript | MDN

async function async function 선언은 AsyncFunction객체를 반환하는 하나의 비동기 함수를 정의합니다. 비동기 함수는 이벤트 루프를 통해 비동기적으로 작동하는 함수로, 암시적으로 Promise를 사용하여

developer.mozilla.org

형태

 

// Promise 객체를 리턴하는 함수

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(ms);
        },ms);
    });
}

// Promise 객체를 이용해서 비동기 로직을 수행할 때

p(1000).then((ms) => {
    console.log(`${ms} ms 후에 실행된다.`);
});

// Promise 객체를 리턴하는 함수를 await 로 호출하는 방법

const ms = await p(1000);
console.log(`${ms} ms 후에 실행된다.`);

결과

이러한 에러가 발생하는데 아래에서 해결한다

async function안에 없어서 이런 에러가 발생한 것이다.

 

// await 를 사용하는 경우, 항상 async 함수 안에서 사용되어야 한다.

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(ms);
        },ms);
    });
}

(async function main() {
    const ms = await p(1000);
    console.log(`${ms} ms 후에 실행된다.`);
})();

결과

1000ms후에 실행됨

// Promise 객체가 rejected 된 경우의 처리를 위해
// try catch 를 이용한다.

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve(ms);
            reject(new Error('reason1'));
        },ms);
    });
}

(async function main() {
    try {
        const ms = await p(1000);    
        //
    } catch (error) {
        console.log(error);
    }
    
})();

결과

1000ms후에 실행됨

// async function 에서 return 되는 값은
// Promise.resolbe 함수로 감싸서 리턴된다.

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve(ms);
            reject(new Error('reason1'));
        },ms);
    });
}

async function asyncP() {
    return 'Mark';
}

(async function main() {
    try {
        const name = await asyncP();
        console.log(name);   
    } catch (error) {
        console.log(error);
    }
    
})();

결과

// async function 에서 return 되는 값은
// Promise.resolve 함수로 감싸서 리턴된다.

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
             resolve(ms);
            //reject(new Error('reason1'));
        },ms);
    });
}

async function asyncP() {
    const ms = await p(1000);
    return 'Mark';
}

(async function main() {
    try {
        const name = await asyncP();
        console.log(name);   
    } catch (error) {
        console.log(error);
    }
    
})();

결과

1000ms 후에 출력된다

// error의 전파

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve(ms);
            reject(new Error('reason1'));
        },ms);
    });
}

async function asyncP() {
    const ms = await p(1000);
    return 'Mark';
}

(async function main() {
    try {
        const name = await asyncP();
        console.log(name);   
    } catch (error) {
        console.log(error);
    }
    
})();

결과

1000ms 후에 에러 출력됨

// finally

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve(ms);
            reject(new Error('reason1'));
        },ms);
    });
}

async function asyncP() {
    const ms = await p(1000);
    return 'Mark';
}

(async function main() {
    try {
        const name = await asyncP();
        console.log(name);   
    } catch (error) {
        console.log(error);
    } finally {
        console.log('end');
    }
})();

결과

1000 ms후에 에러메시지와 finally 안의 end까지 출력된다

// finally

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(ms);
            // reject(new Error('reason1'));
        },ms);
    });
}

async function asyncP() {
    const ms = await p(1000);
    return 'Mark : ' + ms;
}

(async function main() {
    try {
        const name = await asyncP();
        console.log(name);   
    } catch (error) {
        console.log(error);
    } finally {
        console.log('end');
    }
})();

결과

1000ms 후에 결과와 finally안의 end까지 출력됨

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(ms);
            // reject(new Error('reason1'));
        },ms);
    });
}

// Promise
p(1000).then(() => p(1000)).then(p(1000)).then(() => {
    console.log('3000 ms 후에 실행 ');
});

//async await

(async function main() {
    await p(1000);
    await p(1000);
    await p(1000);
    console.log('3000 ms 후에 실행 ');
})();

결과

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(ms);
        },ms);
    });
}

//Promise.all

(async function main() {
    const results = await Promise.all([p(1000), p(2000), p(3000)]);
    console.log(results);
})();

결과

3000ms후에 나온다

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(ms);
        },ms);
    });
}

//Promise.all

// (async function main() {
//     const results = await Promise.all([p(1000), p(2000), p(3000)]);
//     console.log(results);
// })();

//Promise.race

(async function main() {
    const results = await Promise.race([p(1000), p(2000), p(3000)]);
    console.log(results);
})();

결과

1000ms후에 나온다

 

참고용 블로그 : m.blog.naver.com/PostView.nhn?blogId=horajjan&logNo=220607005143&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[자바스크립트] Promise.all과 Promise.race 사용하기

'ECMAScrtipt 6 길들이기, 4장'을 인용하였다 Promise.all(iterable) 메서드 all()은 주어진 이터러...

blog.naver.com

 

'공부내용정리 > JavaScript' 카테고리의 다른 글

연산자  (0) 2021.04.10
변수와 상수  (0) 2021.04.10
JavaScript Promise  (0) 2021.04.08
JavaScript 클래스  (0) 2021.04.07
JavaScript 객체  (0) 2021.04.05
/* 
ES6 부터 JavaScript 의 표준 내장 객체로 추가 되었습니다.
ES6 를 지원하는 브라우저나 Node.js에서 전역에 있는 Promise 를 확인할 수 있습니다.
*/

console.log(Promise);

결과

/*
생성자를 통해서 프로미스 객체를 만들 수 있습니다.
생성자의 인자로 executor 라는 함수를 이용합니다.
*/

new Promise(/* executor */);
/*
executor 함수는 resolve와 rejuect 를 인자로 가집니다.
    (resolve, reject) => { ... }
resolve 와 reject 는 함수 입니다.
    resolve(), reject()
*/

new Promise(/* executor */ (resolve,reject) => {});
/*
생성자를 통해서 프로미스 객체를 만드는 순간 pending (대기) 상태라고 합니다.
*/

new Promise((resolve, reject) => {}); // pending
/*
executor 함수 인자 중 하나인 resolve 함수를 실행하면, fulfilled (이행) 상태가 됩니다.
*/

new Promise((resolve,reject) => {
    //
    // ...
    resolve(); // fulfilled (이행된 상태로 돌입)
})
/* 
executor 함수 인자 중 하나인 reject 함수를 실행하면, rejected(거부) 상태가 된다.
*/

new Promise((resolve, reject) => {
    reject();   // rejected상태
});

/*
p라는 프로미스 객체는 1000ms 후에 fullfilled 됩니다.
*/

new Promise((resolve, reject) => {
    /* pending */
    setTimeout(() => {
        resolve(); /* fulfilled */
    },1000);
});
/* 
p라는 프로미스 객체가 fulfilled 되는 시점에 p.then 안에 설정한 callback 함수가 실행됩니다.
*/

const p = new Promise((resolve, reject) => {
    /* pending */
    setTimeout(() => {
        resolve(); /* fulfilled */
    },1000);
});

p.then(/*callback */);
/* 
p.then 으로 callback 함수를 설정했기 때문에 fulfilled 되면서 callback 이 샐행됩니다.
*/

const p = new Promise((resolve, reject) => {
    /* pending */
    setTimeout(() => {
        resolve(); /* fulfilled */
    },1000);
});

p.then(() => {
    console.log('1000ms 후에 fulfilled 됩니다.')
});

결과

실행시키면 1000ms 후에 결과문이 나온다.

/*
then을 설정하는 시점을 정확히하고,
함수의 실행과 동시에 프로미스 객체를 만들면서 pending 이 시작되도록 하기 위해
프로미스 객체를 생성하면서 리턴하는 함수 (p)를 만들어 함수 (p)실행과 동시에 then을 설정합니다.
*/

function p() {
    return new Promise((resolve, reject) => {
        /* pending */
        setTimeout(() => {
            resolve(); /* fulfilled */
        },1000);
    });
}

p().then(() => {
    console.log('1000ms 후에 fulfilled 됩니다.');
});

결과

실행시키면 1000ms 후에 결과문이 나온다.

/*
마찬가지로 프로미스 객체가 rejected 되는 시점에 p.catch 안에 설정한 callback 함수가 실행된다.
*/

function p() {
    return new Promise((resolve, reject) => {
        /* pending */
        setTimeout(() => {
            reject(); /*rejected */
        },1000);
    });
}

p().then(() => {
    console.log('1000ms 후에 fulfilled 됩니다.');
}).catch(() => {
    console.log('1000ms 후에 rejected 됩니다.');
});

결과

실행시키면 1000ms 후에 결과문이 나온다.

/*
executor 의 resolve 함수를 실행할때 인자를 넣어 실행하면, then 의 callback 함수의 인자로 받을수 있습니다.
    resolve('hello);
    then((message) => {...})
*/

function p() {
    return new Promise((resolve, reject) => {
        /* pending */
        setTimeout(() => {
            resolve('hello');
        },1000);
    });
}

p().then((message) => {
    console.log('1000ms 후에 fulfilled 됩니다.', message);
}).catch(() => {
    console.log('1000ms 후에 rejected 됩니다.');
});

결과

/*
마찬가지로, executor 의 reject 함수를 실행할때 인자를 넣어 실행하면, catch 의 callback 함수의 인자로 받을 수 있습니다.
    reject('error');
    then((reason) => {...})
*/
 
function p() {
    return new Promise((resolve, reject) => {
        /* pending */
        setTimeout(() => {
            reject('error');
        },1000);
    });
}

p().then((message) => {
    console.log('1000ms 후에 fulfilled 됩니다.', message);
}).catch((reason) => {
    console.log('1000ms 후에 rejected 됩니다.', reason);
});

결과

1초후에 에러 메세지가 뜬다

/*
보통 reject함수를 실행하며 rejected 되는 이유를 넘기는데, 표준 내장 객체인 Error 의 생성자를 이용하여 Error 객체를 만듬
*/

function p() {
    return new Promise((resolve, reject) => {
        /* pending */
        setTimeout(() => {
            reject(new Error('bad'));
        },1000);
    });
}

p().then((message) => {
    console.log('1000ms 후에 fulfilled 됩니다.', message);
}).catch((error) => {
    console.log('1000ms 후에 rejected 됩니다.', error);
});

결과

1000ms 후에 만들어진 Error객체를 반환한다

/*
fulfilled 되거나 rejected 된 후에 최종적으로 실행할 것이 있다면, .finally() 를 설정하고, 함수를 인자로 넣습니다.
*/

function p() {
    return new Promise((resolve, reject) => {
        /* pending */
        setTimeout(() => {
            reject(new Error('bad'));
        },1000);
    });
}

p().then((message) => {
    console.log('1000ms 후에 fulfilled 됩니다.', message);
}).catch((error) => {
    console.log('1000ms 후에 rejected 됩니다.', error);
})
.finally(() => {
    console.log('end');
});

결과

/*
보통 비동기 작업을 할떄, callback 함수를 인자로 넣어 로직이 끝나면 callback 함수를 호출합니다.
이런 경우 함수가 아래로 진행되지 않고, callback 함수 안으로 진행됩니다.
*/

//callback처리하는 방법
function c(callback) {
    setTimeout(() => {
        callback();
    }, 1000);
}

c(() => {
    console.log('1000ms 후에 callback 함수가 실행됩니다.');
});

c(() => {
    c(() => {
        c(() => {
            console.log('3000ms 후에 callback 함수가 실행됩니다.');
        });
    });
});

결과

1초후에 첫번째 줄이 출력되고 3초후에 두번째 줄이 출력된다

/*
then 함수에서 다시 프로미스 객체를 리턴하는 방법을 통해 체이닝하면, 비동기 작업을 순차적으로 아래로 표현할 수 있습니다.
then 에 함수를 넣는 여러 방법을 확인해 봅시다.
*/

function p() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve();
        },1000)
    });
}

p().then(() => {
    return p();
})
.then(() => p())
.then(p)
.then(() => {
    console.log('4000ms 후에 fulfilled됩니다.')
})

결과

4000ms후에 출력된다

/*
value가 프로미스 객체인지 아닌지 알 수 없는 경우, 사용하면 연결된 then 메서드를 실행합니다.
    value가 프로미스 객체면, resolve 된 then 메서드를 실행 합니다.
    value가 프로미스 객체가 아니면, value를 인자로 보내면서 then 메서드를 실행합니다.
*/

Promise.resolve(/* value */);

Promise.resolve(
    new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('foo');
    }, 1000);
}),
).then((data) => {
    console.log(
        '프로미스 객체인 경우, resolve 된 결과를 받아 then 이 실행됩니다.', 
        data,
    );
});

Promise.resolve('bar').then(data => {
    console.log('then 메서드가 없는 경우, fulfilled 됩니다.', data);
});

결과

/*
Promise.reject 를 사용하면, catch 로 연결된 rejected 상태로 변경됩니다.
*/

Promise.reject(/* value */);

Promise.reject(new Error('reason'))
.then(error => {})
.catch(error => {
    console.log(error);
});

결과

/*
프로미스 객체 여러개를 생성하여,
배열로 만들어 인자로 넣고 Promise.all 을 실행하면,
배열의 모든 프로미스 객체들이 fulfilled 되었을 때, then 의 함수가 실행된다.
then 의 함수의 인자로 프로미스 객체들의 resolve 인자값을 배열로 돌려준다.
*/

//Promise.all([프로미스 객체들]);

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve();
        },ms)
    })
}

Promise.all([p(1000), p(2000), p(3000)]).then(() => {
    console.log('모두 fulfilled 된 이후에 실행됩니다.');
})

결과

3000ms후에 출력된다

/*
프로미스 객체 여러개를 생성하여,
배열로 만들어 인자로 넣고 Promise.all 을 실행하면,
배열의 모든 프로미스 객체들이 fulfilled 되었을 때, then 의 함수가 실행된다.
then 의 함수의 인자로 프로미스 객체들의 resolve 인자값을 배열로 돌려준다.
*/

//Promise.all([프로미스 객체들]);

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(ms);
        },ms)
    })
}

Promise.all([p(1000), p(2000), p(3000)]).then((messages) => {
    console.log('모두 fulfilled 된 이후에 실행됩니다.', messages);
})

결과

3000ms후에 출력된다

/*
프로미스 객체 여러개를 생성하여,
배열로 만들어 인자로 넣고 Promise.race 를 실행하면,
배열의 모든 프로미스 객체들 중 가장 먼저 fulfilled 된 것으로, then 의 함수가 실행됩니다.
then 의 함수의 인자로 가장 먼저 fulfilled 된 프로미스 객체의 resolve 인자값을 돌려줍니다.
*/

// Promise.race([프로미스 객체들]);

function p(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(ms);
        },ms)
    })
}

Promise.race([p(1000), p(2000), p(3000)]).then((messages) => {
    console.log('가장 빠른 하나가 fulfilled 된 이후에 실행됩니다.', messages);
})

결과

1000ms후에 출력된다

 

'공부내용정리 > JavaScript' 카테고리의 다른 글

변수와 상수  (0) 2021.04.10
JavaScript Async - Await  (0) 2021.04.08
JavaScript 클래스  (0) 2021.04.07
JavaScript 객체  (0) 2021.04.05
JavaScript 함수  (0) 2021.04.04

es6에서 새로 추가된 문법이다.

//class
// 선언적 방식
class A {}

console.log(new A());

// class 표현식을 변수에 할당
const B = class {};

console.log(new B());

// 선언적 방식이지만 호이스팅은 일어나지 않는다.
new C();

class C {}

결과

// constructor

class A{}

console.log(new A());// 객체 생성

// B객체를 만들면 안에 있는 constructor() 가 실행됨
class B{
    constructor() {
        console.log('constructor');
    }
}

console.log(new B());

class C {
    constructor(name, age){
        console.log('constructor', name, age);
    }
}

console.log(new C('Mark', 27));
console.log(new C());

결과

class C의 constructor의 매개변수에 값을 안넣어주면 undefined로 출력되게 된다.

 

// 멤버 변수

class A {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
}

console.log(new A('Mark', 27));

// class field 는 런타임 확인

class B {
    name;
    age;
}

console.log(new B());

class C {
    name = 'no name';
    age = 0;

    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
}

console.log(new C('Mark', 27));

결과

B는 name과 age를 초기화 해주지 않고 호출해서 undefined로 나옴

// 멤버 함수

class A {
    hello1() {
        console.log('hello1', this);
    }

    hello2 = () => {
        console.log('hello2', this);
    };
}

new A().hello1();
new A().hello2();

class B {
    name = 'Mark';
    
    hello() {
        console.log('hello', this.name);
    }
}

new B().hello();

결과

// get, set

class A {
    _name = 'no name';

    get name() {
        return this._name + '@@@';
    }

    set name(value) {
        this._name = value + '!!!';
    }
}

const a = new A();
console.log(a);

a.name = 'Mark';    // setter
console.log(a);
console.log(a.name);    // getter
console.log(a._name);

//readonly

class B {
    _name = 'no name';

    get name() {
        return this._name + '@@@';
    }
}

const b = new B();
console.log(b);
b.name = 'Mark'; // 클래스B안에 setter함수가 없기 때문에 name에 'Mark'가 초기화 되지 않음
console.log(b);

결과

클래스를 new()를 사용해서 객체를 생성하는게 아니라 클래스를 통해서 변수와 함수를 사용하는 방식

 

// static 변수, 함수

class A {
    static age = 37;
    static hello() {
        console.log(A.age);
    }
}

console.log(A, A.age);
A.hello();

class B {
    age = 37;
    static hello() {
        console.log(this.age);
    }
}

console.log(B, B.age);
B.hello();
//new B().hello();

class C {
    static name = '이 클래스의 이름을 C 가 아니다.'
}

console.log(C);

결과

static name은 그 클래스의 이름을 뜻하기도 한다.

// 상속 기본

class Parent {
    name = 'Lee';

    hello() {
        console.log('hello', this.name);
    }
}

class Child extends Parent {

}

const p = new Parent();
const c = new Child();
console.log(p, c);

c.hello();
c.name = 'Anna';
c.hello();

결과

자식클래스는 부모클래스에서 상속받았기때문에 부모클래스에 있는 변수와 함수들을 그대로 가지고 있다.

// 변수, 함수 추가 및 오버라이딩

class Parent {
    name = 'Lee';

    hello() {
        console.log('hello', this.name);
    }
}

class Child extends Parent {
    age = 37;

    hello() {
        console.log('hello', this.name, this.age);
    }
}

const p = new Parent();
const c = new Child();

console.log(p, c);
c.hello();
c.name = 'Anna';
c.hello();

결과

// super

class Parent {
    name;

    constructor(name) {
        this.name = name;
    }

    hello() {
        console.log('hello', this.name);
    }
}

class Child extends Parent {
    age;

    constructor(name, age){
        super(name);
        this.age = age;
   }

   hello() {
       console.log('hello', this.name, this.age);
   }
}

const p = new Parent('Mark');
const c = new Child('Mark', 27);

console.log(p,c);
c.hello();

결과

// static 상속

class Parent {
    static age = 37;
}

class Child extends Parent {}

console.log(Parent.age, Child.age);

결과

'공부내용정리 > JavaScript' 카테고리의 다른 글

JavaScript Async - Await  (0) 2021.04.08
JavaScript Promise  (0) 2021.04.08
JavaScript 객체  (0) 2021.04.05
JavaScript 함수  (0) 2021.04.04
JavaScript 반복문  (0) 2021.03.28

// 생성자 함수

function A() {}

const a = new A();
console.log(a, typeof a);
console.log(A());

 

결과

A()에 return값이 없어서 undefined라고 나온다.

 

// 생성자 함수

function A() {}

const a = new A();
console.log(a, typeof a);
console.log(A());

// 생성하면서 데이터 넣기
function B(name, age) {
    console.log(name, age);
}

const b = new B();//객체 생성
const c = new B('Mark', 27);
console.log(B());

 

결과

 

 

// 값을 속성으로 넣기

function A() {
    this.name = 'Mark';
}

const a = new A(); // {name : 'Mark'}
console.log(a);

// 함수를 속성으로 넣기

function B() {
    this.hello = function() {
        console.log('hello');
    }
}

(new B()).hello();

// new Funcrion()

 

결과

 

// new Object

const a = new Object();

console.log(a, typeof a);

const b = new Object(true);

console.log(b, typeof b);

const c = new Object({name : 'Mark'});
console.log(c, typeof c);

결과

 

Prototype이란?

참고 사이트 : www.nextree.co.kr/p7323/

// prototype

function Person(name, age) {
    this.name = name;
    this.age = age;
    // this.hello = function() {
    //     console.log('hello', this.name, this.age);
    // };
}

Person.prototype.hello = function() {
    console.log('hello', this.name, this.age);
}

const p = new Person('Mark', 37);

p.hello();
console.log(p.toString());

console.log(Person.prototype);
console.log(Person.prototype.toString);
console.log(Person.prototype.constructor);
console.log(Person.prototype.hello);

console.log(Object.prototype);
console.log(Object.prototype.toString);
console.log(Object.prototype.constructor);

console.log(p instanceof Person);// p 가 Person에서 나온거냐 아니냐 true false 반환
console.log(p instanceof Object);// p 가 Object에서 나온거냐 아니냐 true false 반환

결과

 

// prototype

function Person(name, age) {
    this.name = name;
    this.age = age;
    // this.hello = function() {
    //     console.log('hello', this.name, this.age);
    // };
}

Person.prototype.hello = function() {
    console.log('hello', this.name, this.age);
}

const p = new Person('Mark', 37);

p.hello();
console.log(p.toString());

console.log(Person.prototype);
console.log(Person.prototype.toString);
console.log(Person.prototype.constructor);
console.log(Person.prototype.hello);

console.log(Object.prototype);
console.log(Object.prototype.toString);
console.log(Object.prototype.constructor);

console.log(p instanceof Person);// p 가 Person에서 나온거냐 아니냐 true false 반환
console.log(p instanceof Object);// p 가 Object에서 나온거냐 아니냐 true false 반환

 

결과

 

// prototype 상속

function Person() {}

Person.prototype.hello = function (){
    console.log('hello');
}

function Korean(region) {
    this.region = region;
    this.where = function() {
        console.log('where', this.region);
    };
}

Korean.prototype = Person.prototype;

const k = new Korean('Seoul');

k.hello();
k.where();

console.log(k instanceof Korean);
console.log(k instanceof Person);
console.log(k instanceof Object);

결과

 

// 객체 리터럴

const a = {};

console.log(a, typeof a);

const b = {
    name : 'Mark'
};

console.log(b, typeof b);

const c = {
    name : 'Mark',
    hello1(){
        console.log('hello1',this.name);
    },
    hello2: function() {
        console.log('hello2', this.name);
    },
    hello3: () => {
        console.log('hello3', this.name);
    }
};

c.hello1();
c.hello2();
c.hello3();

arrow function 은 this 바인드가 안됨

결과

// 표준 내장 객체 : Array

const a = new Array('red', 'black', 'white');

console.log(a, typeof a);
console.log(a instanceof Array);
console.log(a instanceof Object);

const b = ['red', 'green', 'yellow'];

console.log(b, typeof b);
console.log(b instanceof Array);
console.log(b instanceof Object);

console.log(b.slice(0,1));
console.log(Array.prototype.slice, Object.prototype.slice);

결과

 

'공부내용정리 > JavaScript' 카테고리의 다른 글

JavaScript Promise  (0) 2021.04.08
JavaScript 클래스  (0) 2021.04.07
JavaScript 함수  (0) 2021.04.04
JavaScript 반복문  (0) 2021.03.28
JavaScript 조건문  (0) 2021.03.28

함수(function)

// function
// 이름이 hello1 인 함수를 선언

function hello1() {
    console.log('hello1');
}

console.log(hello1, typeof hello1);

 

함수도 객체의 한 종류라서 hello1함수를 호출하면 객체 형식으로 나옴

 

결과

 

// 함수의 매개변수
// 함수를 호출할 때 값을 지정

function hello2(name) {
    console.log('hello2', name);
}

// 함수의 리턴
// 함수를 실행하면 얻어지는 값

function hello3(name) {
    return `hello3 ${name}`;
}

console.log(hello3('Mark'));

hello3(name) 여기서 name은 매개변수인데 밑에서 hello3을 호출할때 name매개변수에 Mark를 넣어서 호출했으므로

 

결과

 

 

// function
// 이름이 hello1 인 함수를 선언

const hello1 = function() {
    console.log('hello1');
};

console.log(hello1, typeof hello1);

결과

 

function hello1() {
    console.log('hello1');
}

hello1();

 

결과

 

위치를 바꿔도 똑같다

hello1();

function hello1() {
    console.log('hello1');
}

 

결과

 

 

 

// new Function(/* 인자1, 인자2, ....., 함수의 바디 */);

const sum = new Function('a', 'b', 'c', 'return a + b + c');

console.log(sum(1, 2, 3));

 

결과

 

sum선언전에 사용해서 에러가 뜸

// new Function(/* 인자1, 인자2, ....., 함수의 바디 */);
console.log(sum(1, 2, 3));

const sum = new Function('a', 'b', 'c', 'return a + b + c');

결과

 

{
    const a = 1;

    const test = new Function('return a');

    console.log(test());
}

 

결과

a가 정의되지 않았다고 뜬다 여기서 사용 되는 a는 아래의 코드처럼 {}밖에서 전역변수로 지정해줘야 된다

// const sum = new Function('a', 'b', 'c', 'return a + b + c');
global.a = 0;


{
    const a = 1;

    const test = new Function('return a');

    console.log(test());
}

 

결과

 

// const sum = new Function('a', 'b', 'c', 'return a + b + c');
global.a = 0;


{
    const a = 1;

    const test = new Function('return a');

    console.log(test());
}

{
    const a = 2;

    const test = function() {
        return a;
    }

    console.log(test());
}

두번째 {}안의 a는 const a = 2;를 인식해서 아래의 결과와 같이 나온다

 

결과

 

*arrow function (es6에서 생겨남, 항상 익명함수이다) 

// arrow 함수를 만들어 이름이 hello1인 변수에 할당

const hello1 = () => {
    console.log('hello1');
};

// 함수의 매개변수
// 함수를 호출할 때 값을 지정

// 매개변수가 하나일 때, 괄호 생략 가능

const hello2 = name => { // 원래는 (name)
    console.log('hello2', name);
};

const hello3 = (name, age) => {
    console.log('hello3', name, age);
};

// 함수의 리턴
// 함수를 실행하면 얻어지는 값

const hello4 = name => {
    return `hello4 ${name}`;
}

const hello5 = name => `hello5 ${name}`;

 

// 생성자 함수를 이용하여 새로운 객체를 만들어 내는 방법

function Person(name, age) {
    console.log(this);
    this.name = name;
    this.age = age;
}

const p = new Person('Mark', 37);

console.log(p, p.name, p.age);

const a = new Person('Anna', 26);

console.log(a, a.name, a.age);

const Cat = (name, age) => {
    console.log(this);
    this.name = name;
    this.age = age;
}

const c = new Cat('냥이', 1);//불가 이유 : arrowfunction안에서는 this가 생겨나지 않아서 객체안에 프로퍼티를 못넣어준다.

 

결과

 

 

// 함수를 호출하면 함수를 만들어서 리턴

function plus(base) {
    return function(num) {
        return base + num;
    }
}

const plus5 = plus(5);
console.log(plus5(10));

const plus7 = plus(7);
console.log(plus7(8));

 

결과

 

// 함수를 인자로 하여 함수를 호출

function hello(c) {
    console.log('hello');
    c();
}

hello(function() {
    console.log('콜백');
});

 

결과

 

'공부내용정리 > JavaScript' 카테고리의 다른 글

JavaScript 클래스  (0) 2021.04.07
JavaScript 객체  (0) 2021.04.05
JavaScript 반복문  (0) 2021.03.28
JavaScript 조건문  (0) 2021.03.28
JAVASCRIPT 내용 정리  (0) 2021.03.25

반복문(Iteration Statements)

for(초기화; 반복조건; 반복이 된 후 실행되는 코드) {

   반복이 되는 코드 블럭

}

실행순서 a->d->c->b->d->c->b->e

// 초기화 하면서 선언된 변수를 중괄호 안 반복 블럭에서 사용할수 있다.
for (let i = 0; i < 5; i++) {
    console.log('안녕하세요', i);
}

결과

 

for (let i = 0, j = 5; i<5; i++) {
    console.log('안녕하세요', i, j);
}

결과

 

for (let i = 0, j =2; i < 5; i++, j = j * j) {
    console.log('안녕하세요', i, j);
}

결과

 

// 반복문을 즉시 종료하고 싶을 때는 반복되는 블럭 안에서 break; 를 실행하면 가능하다.
for(let i = 0; i < 5; i++) {
    console.log(i);
    if(i > 2) {
        break;
    }
    console.log('안녕하세요', i);
}

결과

 

// 반복되는 블럭 안에서 continue; 를 만나면 거기서 바로 해당 블럭은 종료합니다.
// 그리고 이와 같이 다음 반복이 있으면 다음 반복으로 넘어갑니다.

for(let i = 0; i < 5; i++) {
    console.log(i);
    if(i < 2) {
        continue;
    }
    console.log('안녕하세요', i);
}

결과

 

무한루프

// for 무한 루프
for(;;) {
    console.log('안녕하세요');
    if(Math.random() * 100 > 90) {
        break;
    }
}

무한히 반복하는데 Math.random() * 100으로 랜덤한 정수를 뽑아내고 그것이 90보다 클때까지 반복한다.

 

결과

 

// while 무한 루프
while(true) {
    console.log('안녕하세요');
    if(Math.random() * 100 > 90) {
        break;
    }
}

결과

 

// do while 반복문
do {
    console.log('안녕하세요');
} while(Math.random() * 100 <= 90);

do while문은 일단 한번 실행되고 본다

 

결과

'공부내용정리 > JavaScript' 카테고리의 다른 글

JavaScript 객체  (0) 2021.04.05
JavaScript 함수  (0) 2021.04.04
JavaScript 조건문  (0) 2021.03.28
JAVASCRIPT 내용 정리  (0) 2021.03.25
자바스크립트 출력  (0) 2021.03.12

 

결과

논리 연산자를 이용한 조건문 평가(&&,||,!)

논리 연산자를 이용한 조건부 실행

// 표현식 && 표현식
// 둘다 참 일때만 참이다.
// 표현식은 앞에 먼저 평가하고, 뒤에를 평가한다.
// 앞 표현식을 평가를 해서 참 일때만, 뒤표현식을 평가할 필요가 생기기 때문에 뒤의 표현식이 실행된다.

let n = 5;

(n % 5 === 0) && console.log('5로 나누어 떨어질때만 실행이 됩니다.') // && 앞에가 참일경우에 console.log('5로 나누어 떨어질때만 실행이 됩니다.') 이부분이 실행됨

결과

// 표현식 && 표현식
// 둘다 참 일때만 참이다.
// 표현식은 앞에 먼저 평가하고, 뒤에를 평가한다.
// 앞 표현식을 평가를 해서 참 일때만, 뒤표현식을 평가할 필요가 생기기 때문에 뒤의 표현식이 실행된다.

let n = 7;

(n % 5 === 0) && console.log('5로 나누어 떨어질때만 실행이 됩니다.') // && 앞에가 참일경우에 console.log('5로 나누어 떨어질때만 실행이 됩니다.') 이부분이 실행됨

n을 7로 바꾸면 && 앞부분부터 참이 아니므로 && 뒷부분도 실행이 되지 않는다.

 

결과

 

// 앞 표현식의 평가 결과가 거짓일때는 뒤 표현식을 평가할 필요가 없어서 실행하지 않는다.
n = 6;

(n % 5 === 0) && console.log('5로 나누어 떨어질때만 실행이 됩니다.');

결과

 

n = 5;

n % 5 === 0 || console.log('5로 나누어 떨어지지 않을때만 실행');

// 앞 표현식을 평가를 해서 거짓 일때만, 뒤 표현식을 평가할 필요가 생기기 때문에 뒤의 표현식이 실행된다.

n = 6;

n % 5 === 0 || console.log('5로 나누어 떨어지지 않을때만 실행');

결과

 

삼항 연산자를 이용한 조건부 실행

// 조건 ? 조건이 참이면 실행되는 표현식 : 조건이 거짓이면 실행되는 표현식
// 중괄호 {} 를 사용할 수 없는 문법이기 때문에 하나의 표현식만 가능합니다.

let n = 5;

console.log(n % 5 === 0 ? '5의 배수 입니다.' : '5의 배수가 아닙니다.');

// 표현식의 결과를 변수에 할당할 수 있습니다.

const message = n % 5 === 0 ? '5의 배수 입니다.' : '5의 배수가 아닙니다.';
console.log(message);

결과

 

 

switch를 이용한 조건문

// switch 뒤 괄호 안에 있는 값이 무엇인지 중괄호 안에 있는 코드들을 비교해서 실행합니다.
// 아중에 default: 뒤에 있는 문장은 항상 참이어서 실행되는 블럭 입니다.
// 문장이 한줄이라서 중괄호는 생략했습니다.

let n = 5;

switch (n) {
    default:
        console.log(n);
}

 

결과

 

// 다음은 n 이 5로 나누었을떄 나머지가 0 인경우에 실행되는 블럭을 추가한 것입니다.
// case '비교할 값' : 을 이용해서 맞으면 실행됩니다.
// case 0: 인경우와 default : 인 경우 두 블럭 모두 순서대로 실행이 됩니다.

let n = 5;

switch (n % 5) {
    case 0:
        console.log('5의 배수입니다.');
    default:
        console.log(n);
}

 

결과

 

// 만약에 해당 블럭이 실행된후 다음 블럭을 거치지 않고 switch 문을 나가고 싶다면,
// case 문 안에서 break; 를 실행합니다.

let n = 5;

switch (n % 5) {
    case 0:
        console.log('5의 배수입니다.');
        break;
    default:
        console.log(n);
}

 

결과

 

let n = 6;

switch (n % 5) {
    case 0:{
        console.log('5의 배수입니다.');
        break;
    }
    case 1:
    case 2:
    case 3:
    case 4:
        console.log('5의 배수가 아닙니다.');
    default:
        console.log(n);
}

n 이 6이라서 case 0일때 안걸리고 case 1,2,3,4와 default에 걸리게 된다.

 

결과

 

'공부내용정리 > JavaScript' 카테고리의 다른 글

JavaScript 함수  (0) 2021.04.04
JavaScript 반복문  (0) 2021.03.28
JAVASCRIPT 내용 정리  (0) 2021.03.25
자바스크립트 출력  (0) 2021.03.12
자바스크립트의 위치  (0) 2021.03.12

+ Recent posts