현재 시간


let today = new Date()

년 / 월 / 일 따로 가져오기


let today = new Date()

let year = today.getFullYear();
let month = today.getMonth();
// 0 붙여서 => let month = ('0' + (today.getMonth() + 1)).slice(-2);
let day = today.getDate();
// 0 붙여서 => let day = ('0' + (today.getDate())).slice(-2);

let dateString = year + '-' + month + '-' + day;

console.log(dateString)
  • 한자리수의 경우 앞에 0 넣어주어서 포매팅
  • getMonth의 경우는 0부터 시작함에 유의 !!

Array.prototype.slice


  • (begin, end) : 시작점 ~ 끝점까지 추출한 배열 리턴
  • (begin) : 시작점 ~ 끝까지 추출한 배열 리턴
  • begin이나 end에는 음수 인덱스가 올 수 있음(파이썬과 같음)
  • end는 포함되지 않음

'Language > JavaScript' 카테고리의 다른 글

[ JavaScript ] async, await  (0) 2021.08.03
[ JavaScript ] Promise  (0) 2021.08.03
[ JavaScript ] Json  (0) 2021.08.01
[ JavaScript ] 웹 기초  (0) 2021.07.31
[ JavaScript ] 객체지향 프로그래밍  (0) 2021.07.30

async/await


async function fetchAndPrint() {
    const response = await fetch('https://jsonplaceholder.typicode.com/users');
    const result = await response.text();
    console.log(result);
}
  • async
    • 함수 안에 비동기적으로 실행되는 부분이 있다(await)
  • await
    • 뒤에 코드를 실행하고 프로미스 객체가 fulfilled/rejected 될때까지 기다림, fulfilled가 되면 작업 실행 결과 리턴
    • async 안에서만 사용 가능함.
async function fetchAndPrint() {
    console.log(2);
    const response = await fetch('https://jsonplaceholder.typicode.com/users');
    // fetch 완료될때까지 4는 실행되지 않음. 함수 밖의 나머지 코드들 실행
    console.log(4);
    const result = await response.text();
    console.log(result);
}

console.log(1);
fetchAndPrint();
console.log(3); // await 만나면 3부터 실행
  • await이 있으면 보이는대로 실행되는것이 아님!!
  • await을 만나게 되면 실행 순서를 함수의 다음 코드로
  • 기존 promise 구문을 깔끔하게 작성할 수 있음.

rejected 상태가 된다면


async function fetchAndPrint() {
    try {
        const response = await fetch('https://jsonplaceholder.typicode.com/users');
        const result = await response.text();
        console.log(result);
    } catch (error) {
        // rejected 상태가 생기면 catch문으로 코드의 실행 흐름 넘어옴
        // error 파라메터에 작업 실패 정보
    } finally {
        // 잘 성공하든 실패하든 무조건 실행
    }
}

fetchAndPrint();
  • try .. catch문을 사용하면 된다.

async


  • async가 붙은 함수는 항상 Promise 객체를 리턴한다.
  • promise 객체가 리턴되면 해당 객체와 동일한 상태와 작업 성공 결과 / 실패 정보
    가진 프로미스 객체 그대로 리턴
  • promise 객체가 아닌 숫자나 문자열, 일반 객체 등을 리턴하는 경우
    • fulfill 상태이면서, 리턴값을 작업 성공 결과로 가진 Promise 객체 리턴
    • undefined인 경우도 fulfill 상태이면서, 작업 성공 결과가 undefined인 promise 객체
    • 에러 발생시 rejected 상태이면서 에러 객체를 작업 실패 정보로 가진 promise 객체 리턴
async function f() {
    return 3;
} // 숫자 3을 작업 성공 결과로 가진 fulfill 상태의 promise 객체 리턴

async function f() {
    return fetch('https://jsonplaceholder.typicode.com/users')
        .then((response) => response.text());
} 
/*promise 객체가 리턴되면 해당 객체와 동일한 상태와 작업 성공 결과 / 실패 정보 
가진 프로미스 객체 그대로 리턴*/

async 안의 async 함수


  • async 함수는 promise 객체를 리턴
  • 다른 async 함수에서 await 키워드를 붙여서 사용할 수 있다.

async 위치


async function f() { }

const f = async function() { }
const f = async (a) => {}
const f = async (a) => a;

( function f() {
    console.log('test')
}()); // 즉시 실행 함수

(async function f() {
    console.log('test')
}());

async 함수 작성시 성능


  • 요청 하나씩 보내고 기다리는 케이스
    • 순서가 중요한 경우
for (const url of urls) {
    const response = await fetch(url);
    console.log(await response.text());
}
  • 일단 모든 요청을 다 보내고 기다리는 케이스
    • 순서같은게 중요하지 않은 경우
for (const url of urls) {
    (async () => {
        const response = await fetch(url);
        console.log(await response.text());
    })();
}
  • 콜백이 여러번 실행되는 경우는 promisify 불가능
  • async/await은 함수 내가 아닌 코드의 최상위 영역에서는 사용 불가능 (then 메서드 써야함.)
  • 콜백에는 동기 실행과 비동기 실행 모두 존재한다.

'Language > JavaScript' 카테고리의 다른 글

[ JavaScript ] 오늘 날짜 가져오기  (0) 2021.08.29
[ JavaScript ] Promise  (0) 2021.08.03
[ JavaScript ] Json  (0) 2021.08.01
[ JavaScript ] 웹 기초  (0) 2021.07.31
[ JavaScript ] 객체지향 프로그래밍  (0) 2021.07.30

비동기 실행


  • Start! → end! → fetch 실행
console.log('start!')

fetch('https://jsonplaceholder.typicode.com/users')
    .then((response) => response.text())
    .then((result) => {console.log(result);});

console.log('end!')
  • then 메소드 : 콜백을 등록하는것, 실행하지는 않음.
  • 따라서 end가 먼저 실행되고, 서버의 response가 도착하면 콜백이 실행됨.
  • fetch → promise 객체 리턴, 비동기 실행과 연관 있음.

비동기 실행


  • 특정 작업을 시작하고 완벽하게 다 처리하기 전에, 실행 흐름이 바로 다음 코드로 넘어가고 나중에 콜백이 실행되는 것

  • 동기 실행 → 한번 시작한 작업을 다 처리하고 나서 다음코드로 넘어감

    비동기 실행 함수

    1. setTimeout 함수

      • 특정 함수의 실행을 원하는 시간만큼 뒤로 미루기 위해 사용하는 함수

        console.log('start!')
        
        setTimeout(() => { console.log("end1"); }, 2000) // 2초 뒤
        
        console.log('end2')
    2. setInterval 함수

      • 특정 콜백을 일정한 시간 간격으로 실행하도록 등록하는 함수

        console.log('start!')
        
        setInterval(() => { console.log("end1"); }, 2000) // 2초 간격으로 계속 실행
        
        console.log('end2')
    3. addEventListener

      • 특정 조건(클릭 등)이 만족될때 마다 실행

        btn.addEventListener('click', (e) => {
          // 처리 내용
        });
    • fetch 함수는 좀 더 새로운 방식으로 비동기 실행을 지원하는 자바스크립트 문법
      • Promise 객체 리턴
      • Promise 객체 : 비동기 실행을 지원하는 또 다른 종류의 문법

Promise


  • 작업에 관한 상태 정보를 갖고 있는 객체
  • 작업이 성공했는지 실패했는지 알 수 있음.
    • pending - 작업 진행 중
    • fulfilled - 작업 성공 → 작업의 성공 결과또한 가지고 있음.(fetch의 then의 response)
    • rejected - 작업 실패 → 작업의 실패 이유에 대한 정보또한 가지고 있음.
  • then 메소드도 Promise의 메소드
fetch('https://jsonplaceholder.typicode.com/users')
    .then((response) => response.text())
    .then((result) => {console.log(result);});
// then은 pending->fulfilled 상태가 되었을때 실행할 코드 등록
// 작업 성공 결과는 콜백의 첫번째 파라메터

Promise Chaining


  • then메서드 뒤에 then메서드를 붙이는 것
  • Promise 객체를 계속해서 연결
  • then 메서드가 새로운 Promise 객체를 리턴함.
    • 가장 처음에는 Pending 상태
    • callback에서 리턴하는 값에 따라 달라짐
      1. promise 객체 리턴 ⇒ 콜백에서 리턴한 promise 객체와 같은 상태, 같은 정보
      2. promise가 아닌것 리턴 ⇒ fulfilled 상태, 작업 성공 결과 : return값
fetch('https://jsonplaceholder.typicode.com/users')
    .then((response) => response.text()) // text 메서드는 promise 리턴
    .then((result) => {
        return 'a';
    }).then((t) => { console.log(t); });
  • response.text(), response.json() ⇒ promise 객체 리턴
  • 비동기 작업을 순차적으로 실행할 때, 전체 코드를 깔끔하게 하기 위해 사용

Rejected 상태일때의 콜백


  • then 메서드의 두번째 인자에 error시의 콜백함수
  • 작업 실패 시 작업 실패 정보가 들어옴
fetch('https://jsonplaceholder.typicode.com/users')
    .then((response) => response.text(), (error) => { console.log(error); }) 
    .then((result) => {
        return 'a';
    }).then((t) => { console.log(t); });
  • 콜백 실행 중간에 에러 발생 시
    • Rejected, 작업 실패 정보로 에러 객체를 가짐.

Callback


  1. Promise 객체 이외의 값 리턴

    → fulfilled, 작업 성공 결과로 해당 값 가짐

  2. 콜백의 리턴이 없음

    → fulfilled, undefined 리턴한 것으로 간주

  3. 콜백 내부 에러

    → rejected, 작업 실패 정보로 에러 객체

  4. 콜백이 없을때

    → 이전 promise 객체와 동일한 상태와 정보를 가짐.

Catch


  • promise rejected시 실행되는 코드 지정(then메서드의 두번째 콜백 안써줌)

  • Catch 메서드는 fulfilled 리턴

  • then 메서드를 변형한것과 같음.

    • then(undefined, (error) => { console.log(error); })

    • 에러가 발생하더라도 then메서드를 타고 내려간다. 종료 X (에러 객체가)

      fetch('https://jsonplaceholder.typicode.codddm/users')
        .then((response) => response.text())
        .catch((error) => { console.log(error); })
        .then((result) => {
            return 'a';
        }).then((t) => { console.log(t); });
  • catch 메소드는 마지막에 쓰인다.

    • 어디서 에러가 생기던지 간에 가장 잘 대처하는 방법

    • 넘어온 에러는 name과 message 프로퍼티를 통해 살펴볼 수 있다.

      fetch('https://jsonplaceholder.typicode.codddm/users')
        .then((response) => response.text())
        .then((result) => {
            return 'a';
        })
        .then((t) => { console.log(t); })
        .catch((error) => { console.log(`${error.name}이고, 이유는.. ${error.message}`); });
  • 에러 발생시 대안을 뒤로 넘겨줄 수 있다면 catch를 중간에 써도 됨.

    • 작업을 살릴수 있는 방법이 있다면 Promise Chaining 중간에 catch
    • 예시로 .. A → B → C로 넘겨줄 때, B에서 에러가 발생한 경우 D로 대체할 수 있다면 catch문에서 B를 D로 대체 후 진행.
      • A → D → C

Finally


  • 성공하던지, 실패하던지 상관 없이 항상 실행하고 싶은 코드 등록

  • catch보다도 뒤에 작성

    • 파라메터는 따로 필요하지 않음

      fetch('https://jsonplaceholder.typicode.codddm/users')
        .then((response) => response.text())
        .then((result) => {
            return 'a';
        })
        .then((t) => { console.log(t); })
        .catch((error) => { console.log(`${error.name}이고, 이유는.. ${error.message}`); })
        .finally(() => {console.log('i am finally')});
      
      fetch('https://jsonplaceholder.typicode.codddm/users')
        .then((response) => response.text())
        .then((result) => {
            return 'a';
        })
        .then((t) => { console.log(t); })
        .catch((error) => { 
            console.log(`${error.name}이고, 이유는.. ${error.message}`);
            new Error('error!!'); 
        })
        .finally(() => {console.log('i am finally')});

Promise 객체의 등장 배경


  • Promise가 없다면?

    • 콜백 지옥 또는 콜백 헬(callback hell), 지옥의 피라미드

      fetch(url, function c1() {
        fetch(url, function c2() {
            fetch(url, function c3() {
                ...
            }
        }
      })
  • 콜백 헬 문제 해결, 비동기 작업 처리에 관한 좀 더 세밀한 처리 가능

Promise 생성


const prom = new Promise((resolve, reject) => {
    //setTimeout(() => { resolve('success');}, 2000);
    setTimeout(() => { reject(new Error('fail')); }, 2000);
});

//prom.then((result) => {console.log(result);})
prom.catch((error) => {console.log(error);})
  • resolve, reject ⇒ 'executor' 함수
  • resolve ⇒ fulfilled로 만들수 있는 함수
  • reject ⇒ rejected로 만들수 있는 함수

resolve, reject 사용하여 바로 생성


const prom1 = new Promise.resolve('success'); // fulfilled 상태의 promise 객체 생성
const prom2 = new Promise.reject(new Error('fail')); // fail 상태의 promise 객체 생성

// prom1은 then의 첫번째 파라메터 실행
// prom2는 then의 두번째 파라메터나 catch

Promise 객체는 언제 생성?


  1. 전통적인 형식의 비동기 실행 함수를 사용하는 코드를 Promise 기반의 코드로 변환

    • Promise Chaining 안에서 setTimeout 등 비동기 실행 함수 사용시 리턴값을 Promise Chain에서 사용할수 없음.

    • Promise 객체 생성

        function wait(text, milliseconds) {
          const p = new Promise((resolve, reject) => {
            setTimeout(() => { resolve(text); }, 2000);
          });
          return p;
        }
      
        fetch('https://jsonplaceholder.typicode.com/users')
          .then((response) => response.text())
          .then((result) => wait(`${result} plus alpha`, 2000))
          .then((result) => { console.log(result); });
    • Promisify

      • 비동기 실행 함수를 Promise 객체로 감싸서 Promise 객체를 리턴하는 형식으로 만드는 작업
  • 콜백을 여러번 하는 경우(setInterval, EventListener)

    • Promisify 해서는 안된다.

      ⇒ 한번 pending에서 fulfilled/rejected 상태가 되면 그 뒤로는 상태와 결과가 바뀌지 않음.

여러 Promise 객체


all 메소드


Promise
.all([프로미스 객체, ... ])
.then((results) => {
    console.log(results); // array
});
  • 모든 객체가 fulfill 되기까지 기다림
  • 하나라도 reject가 되면 all 메소드는 reject 프로미스 리턴
  • 하나의 작업이라도 실패하면 전체 작업이 실패할 때 사용

race 메소드


Promise
.race([프로미스 객체, ...])
.then((result) => {
    console.log(result); // 단일 객체
});
  • 가장 먼저 fulfilled / reject 상태가 되는 Promise 객체와 동일한 상태/결과인 Promise 리턴

allSettled


  • fulfilled와 rejected 상태를 묶어서 settled 상태라고 한다.
  • 배열 내의 모든 Promise 객체가 fulfilled / rejected 상태가 되기까지 기다림,
  • 각 Promise 객체의 최종 상태(status), 작업 성공결과(value)/작업 실패정보(reason) 리턴

any


  • Promise 객체중 가장 먼저 fulfilled 상태가 된 Promise 객체의 상태/결과 반영
  • 모든 Promise 객체가 rejected 상태가 되면 AggregateError 에러 (rejected)

axios


  • Ajax 통신을 할 수 있는 또다른 방법
axios
  .get('https://jsonplaceholder.typicode.com/users')
  .then((response) => {
    console.log(response);
  })
  .catch((error) => {
    console.log(error);
  });
  • axios에서도 promise 객체를 리턴한다.
  • axios는 별도의 패키지 다운로드가 필요함.
  • axios의 기능 / 장점
    • 모든 리퀘스트, 리스폰스에 대한 공통 설정 및 공통된 전처리 함수 삽입 가능
    • serialization, deserialization을 자동으로 수행
    • 특정 리퀘스트에 대해 얼마나 오랫동안 리스폰스가 오지 않으면 리퀘스트를 취소할지 설정 가능(request timeout)
    • 업로드 시 진행 상태 정보를 얻을 수 있음
    • 리퀘스트 취소 기능 지원

'Language > JavaScript' 카테고리의 다른 글

[ JavaScript ] 오늘 날짜 가져오기  (0) 2021.08.29
[ JavaScript ] async, await  (0) 2021.08.03
[ JavaScript ] Json  (0) 2021.08.01
[ JavaScript ] 웹 기초  (0) 2021.07.31
[ JavaScript ] 객체지향 프로그래밍  (0) 2021.07.30

JSON


  • JSON 데이터 Response 받는 코드
fetch('https://jsonplaceholder.typicode.com/users')
    .then((response) => response.text())
    .then((result) => { console.log(result) });
  • JSON(JavaScript Object Notation)

    • 자바 스크립트의 문법과 비슷

    • 사용자 하나의 정보를 객체로 표현(중괄호 이내에 프로퍼티)

    • 여러개의 데이터를 대괄호([])로 표현

    • 프로퍼티의 이름을 반드시 큰따옴표("") 사용해주어야 한다.

    • 값이 문자열인 경우 반드시 큰따옴표("") 사용

    • undefined, NaN, Infinity 등 사용 불가능

    • 주석 추가 불가능

      {
       "attr1":"문자문자열",
       "attr2":0,
       "attr3":15,
       "attr4":["문자열1", "문자열2"]
      }

JSON ↔ 객체 변환


  • 문자열 → JSON 객체 변환
fetch('https://jsonplaceholder.typicode.com/users')
    .then((response) => response.text())
    .then((result) => { 
        const users = JSON.parse(result); 
        console.log(users.length);
        console.log(users);
        users.forEach((element) => {
            console.log(element.name);
        });
    });
  • parse의 결과 배열이 리턴되었음. 아마 가장자리가 []로 되어있어서 그런듯.
  • [ ]로 안되있는 경우 테스트.
const test = '{"a":"b"}'
console.log(JSON.parse(test));
  • 그냥 Object가 나타나는것을 볼 수 있음.

CRUD


  • 웹 브라우저가 서버로 보내는 리퀘스트의 종류에 크게 4가지 종류
  1. GET : 기존 데이터 조회
  2. POST : 새 데이터 추가
  3. PUT : 기존 데이터 수정
  4. DELETE : 기존 데이터 삭제

Request 테스트


  • 사이트 => 비공개

  • 전체 직원(GET)

      fetch('https://../api/members')
          .then((response) => response.text())
          .then((result) => { 
              console.log(result);
          });
  • 특정 직원(GET)

      fetch('https://../api/members/3')
          .then((response) => response.text())
          .then((result) => { 
              console.log(result);
          });
  • 직원 추가(POST)

    • fetch에 새로운 argument(옵션 객체) 추가

      • 옵션 객체에 method와 body 추가
    • JSON.stringify : 객체를 JSON 데이터로 변환

      const newMember = {
        name: 'Jerry',
        email: 'jerry@codeitmall.kr',
        department: 'engineering',
      }
      
      fetch('https://../api/members', {
        method: 'POST',
        body: JSON.stringify(newMember),
      }).then((response) => response.text())
        .then((result) => { console.log(result) });
  • 직원 변경(PUT)

      const member = {
          name: 'Alice',
          email: 'alice@codeitmall.kr',
          department: 'marketing',
      }
    
      fetch('https://../api/members/2', { // 2번 유저에대한 데이터 수정
          method: 'PUT',
          body: JSON.stringify(member),
      }).then((response) => response.text())
          .then((result) => { console.log(result) });
  • 직원 삭제(DELETE)

      fetch('https://../api/members/2', { // 2번 유저에대한 데이터 삭제
          method: 'DELETE',
      }).then((response) => response.text())
          .then((result) => { console.log(result) });

'Language > JavaScript' 카테고리의 다른 글

[ JavaScript ] async, await  (0) 2021.08.03
[ JavaScript ] Promise  (0) 2021.08.03
[ JavaScript ] 웹 기초  (0) 2021.07.31
[ JavaScript ] 객체지향 프로그래밍  (0) 2021.07.30
[ JavaScript] 배열, 모듈  (0) 2021.07.29

웹 기초


Fetch


  • 크롬 - F12 - 개발자 도구

  • https://google.com 접속

  • 다음 코드 콘솔에 입력

      fetch('https://www.google.com') // url로 request 요청
          .then((response) => response.text()) // 응답 가져옴, arrow function, 곧바로 리턴
          .then((result) => {console.log(result);}); // 위 콜백이 실행된 다음에 실행. 
          // 위 then의 리턴값이 아래 then의 입력값으로 들어감
    
      // 어떤 조건이 만족되었을때 실행되는 함수 : 콜백 함수
      // .then => 콜백 등록 메소드, fetch가 리턴될 때 호출(promise)
    

    ⇒ fetch 함수를 통해 서버로 request를 보낸 후 응답을 콘솔에 나타냄

    • fetch의 return은 response
      • response의 부가정보와 실제 내용을 가진 객체

URL : Uniform Resource Locator


  • 특정 데이터를 나타내는 문자열
  • 프로토콜://호스트/경로(path)/쿼리(Query)
  • 쿼리는 등호=값, &로 연결되어 있음.
  • 프로토콜에 맞게 request / response 해주어야 함.
  • http : HyperText Transfer Protocol
  • https : http + secure

'Language > JavaScript' 카테고리의 다른 글

[ JavaScript ] Promise  (0) 2021.08.03
[ JavaScript ] Json  (0) 2021.08.01
[ JavaScript ] 객체지향 프로그래밍  (0) 2021.07.30
[ JavaScript] 배열, 모듈  (0) 2021.07.29
[ JavaScript ] 함수, 표기법, 예외 처리  (0) 2021.07.29

객체지향 프로그래밍


  • 객체
    • 객체의 상태를 나타내는 변수
    • 객체의 행동을 나타내는 함수

객체 생성


  • 객체 생성 방법

      const object = {
          attr1: 'a',
          attr2: 'b', // 프로퍼티
          func(a) {
              console.log(`${this.attr1}`); // this는 자기 자신 객체 가리킴
          },
      };
  • Factory Function

    • 객체를 생성하는 함수를 따로 만들어 줌.

      function createObject(attr1, attr2) {
        const object = {
            attr1: attr1,
            attr2: attr2, // 프로퍼티
            func(a) {
                console.log(`${this.attr1}`); // this는 자기 자신 객체 가리킴
            },
        };
        return object;
      }
      
      // 위에거 축약
      function createObject(attr1, attr2) {
        const object = {
            attr1,
            attr2, // 프로퍼티
            func(a) {
                console.log(`${this.attr1}`); // this는 자기 자신 객체 가리킴
            },
        };
        return object;
      }
      
      obj1 = createObject('a', 'b') // 객체 편하게 생성 가능
  • Constructor Function (생성자 함수)

    • 생성자 함수를 정의 & new 연산자 사용

      function Object(attr1, attr2) { // 함수를 통해서 객체 생성 가능
        this.attr1 = attr1; // this : constructor function으로 생성한 객체
        this.attr2 = attr2;
        this.f = function(a) {
            ..
        };
      }
      
      const obj = new Object('a', 'b') // 반드시 new를 붙여주어야 함.
      
  • Class

    • class를 정의하여 객체 생성 가능

      class Object { 
        constructor(attr1, attr2) { // 생성자 안에서는 프로퍼티
            this.attr1 = attr1;
            this.attr2 = attr2;    
        }
      
        f(a) { // 메서드는 생성자 밖에서 선언
            ...
        }
      }
      
      const obj = new Object('a', 'b')

객체지향 프로그래밍


  1. 추상화

    • 구체적인 존재를 간략화해서 나타내는 것
    • 클래스명, 프로퍼티명, 메소드명을 잘 정하는 것이 중요
    • 코드에 코멘트나 별도의 문서를 두어 잘 이해할 수 있도록 하는게 중요
  2. 캡슐화

    • 객체의 특정 프로퍼티에 직접 접근하는 것을 막음

      class object {
        constructor() {
            this.attr1 = "attr";
        }
      
        set attr1(arg) { // setter, attr1 프로퍼티 값 수정할때 이상한 값 넣었는지 체크
            if (arg === 'a') {
                this._attr1 = arg; // _가 붙은 프로퍼티에 값 넣어줌(숨긴 프로퍼티)
            } else {
                throw new Error('value error');
            }
        }
      
        get attr1() { // getter 메서드
            return this._attr1; // 리턴값은 원하는대로 수정 가능
            // return `attr1 : ${_attr1}`;
        }
      }
      
      obj = new object();
      obj.attr1 = 'a'; // setter 호출
      console.log(obj.attr1) // getter 호출
      
  3. 상속

     class object {
         constructor(a) {
             this.attr1 = a;
         }
     }
    
     class obj_child extends object {
         constructor(a, b) {
             super(a); // 상속 시에는 부모 클래스의 생성자를 super를 통해 반드시 호출
             this.attr2 = b;
         }
     }
  4. 다형성

    • 많은 형태를 갖는 성질

    • 오버라이딩 : 원래 정의된 부모 클래스의 메소드를 덮어씌움

    • 하나의 변수가 다양한 종류의 객체 접근 가능

      class object {
        constructor(a) {
            this.attr1 = a;
        }
        f(a) {
            console.log("parent:"+a);
        }
      }
      
      class obj_child extends object {
        constructor(a) {
            super(a);
        }
        f(a) {
            console.log("child:"+a);
        }
      }
      
      let p_arr = [new object(10), new obj_child(10)];
      p_arr.forEach((element) => {
        element.f(10); // object, obj_child 두개 다 접근 가능
      });
      

클로저(Closure)


function createObject(a) {
    let outera = a; // outera는 외부에서 사용 불가능
    function f() { // f는 외부에서 호출 불가능

    }
    const obj = { // 객체 내부에서는 outera, f 사용하더라도 보존됨.
        get a() {
            return outera;
        },
        set a(newa) {
            outera = newa;
        }
    }
}
  • 클로저 : 어떤 함수와 그 함수가 참조할 수 있는 값들로 이루어진 환경을 하나로 묶은 것
  • 즉, outera는 외부에서는 obj.a를 통해서만 읽을 수 있다.

JavaScript


부모 클래스의 메소드 사용


  • super.메소드()
class obj {
    constructor(a) {
        this.a = a
    }
    f(a) {
        console.log("parent->f")
    }
}

class obj_child extends obj {
    constructor(a) {
        super(a);    
    }
    f(a) {
        super.f(a)
    }
}

현재 변수의 클래스 확인


  • instanceof 연산자 사용
    • child가 parent를 상속한 경우
    • child instanceof parent ⇒ True
    • child instanceof child ⇒ True
    • parent instanceof child ⇒ False
  • instanceof를 활용한 분기문보다는 다형성을 활용하여 메소드 구성하는게 더 나음
변수 instanceof 클래스 // ==> 변수가 클래스인 경우에만 True

Static 프로퍼티 / Static 메서드


  • 클래스에 직접적으로 달려있는 프로퍼티와 메서드
class Calculator {
    static i = 0;
    static sum(a, b) {
        return a + b;
    }
}

Calculator.i; // 0
Calculator.sum(3, 5); // 8

/* 프로퍼티 추가&변경 / 메서드 추가 가능 */
Calculator.i = 10;
Calculator.minus = function(a, b) {
    return a - b;
}

'Language > JavaScript' 카테고리의 다른 글

[ JavaScript ] Json  (0) 2021.08.01
[ JavaScript ] 웹 기초  (0) 2021.07.31
[ JavaScript] 배열, 모듈  (0) 2021.07.29
[ JavaScript ] 함수, 표기법, 예외 처리  (0) 2021.07.29
[ JavaScript ] 데이터 타입  (0) 2021.07.29

[배열] forEach와 map


  • for .. of문과 비슷

  • forEach

      arrays.forEach((element) => {
          console.log(`${element}`);
      });
    
      arrays.forEach((element, idx) => {
          // element, index
      });
    
      arrays.forEach((element, idx, arr) => {
          // 개별요소, 개별요소의 인덱스, 호출한 배열
      });
  • map

      const newarray = arrays.map((element, idx) => {
          return element + p
      }); // 모든 요소에 p를 더한 새로운 배열 반환
  • forEach, map 도중에 배열에 추가/삭제 가능. 추가하더라도 호출한 시점의 요소 수만큼만 반복

  • 단, 삭제시에는 forEach/map이 삭제된 요소 수만큼 덜 반복

  • JavaScript에서

  • 태그의 값 수정하기

      new_element.innerText=`${idx+1}.${title}`
      new_element.textContent = `${idx+1}.${title}`

[배열]Filter/find


  1. Filter

    1. 조건에 맞는 요소들만 가져옴

    2. 배열이 리턴됨.

      const filtering_array = arrays.filter((element) => element.a === 'a') // 
      
      const filtering_array = arrays.filter((element) => {
       return element.a === 'a';
      });
  2. find

    1. 조건에 맞는 하나의 요소를 가져옴

    2. 하나 찾는순간 종료(0에서부터 첫번째)

    3. 존재하지 않으면 undefined 리턴

      const filter_target = arrays.find((element) => element.a === 'a');
      
      // 다른 예시
      const user = data.find((e) => {
       return e.userName === nameValue && e.phoneNumber === phoneValue;
      })

[배열] some/array


  1. some : 만족하는 요소가 1개라도 있는지

    • 첫번째 요소를 찾는 순간 반복 종료

      const p = [1, 2, 3, 4, 5]
      const test = p.some((e) => e>=5); // true
  2. every : 모든 요소가 조건을 만족하는지

    • 요소가 조건을 만족하지 않는다면 반복 종료

      const p = [1, 2, 3, 4, 5]
      const test = p.every((e) => e>=5); // false
  • 빈 배열의 경우 some은 false, every는 true

[배열] reduce


  1. reduce

     arrays.reduce((acc, el, i, arr) => {
         return nextAccValue;
     }, initialAccValue); // 초기 acc 값 조정
    
     // acc : 누산기, 다음 요소로 전달
     // el : 현재 요소
     // i : 현재 요소의 인덱스
     // arr : 전체 배열
    
     const totalCareer = data.reduce((acc, element, i, arr) => {
       acc += element.month
       return acc
     }, 0) // 전체 일한 개월수 구하는 소스

[배열] sort, reverse


  1. sort

    • 유니코드 기준 오름차순/내림차순이어서 평소 알던대로 정렬되지 않음.

    • 콜백함수 정의

        arrays.sort((a, b) => b-a) // 내림차순
        arrays.sort((a, b) => a-b) // 오름차순
      
        // 원본 배열의 요소들을 정렬함.
  2. reverse

     arrays.reverse() // 원본 배열을 뒤집음

Map, Set


  1. Map
    • 메소드를 통해 값 추가/접근
    • 메소드
      • new Map() ⇒ 생성
      1. map.set(key, value) ⇒ key,value 추가
      2. map.get(key) ⇒ key에 해당하는 값 리턴
      3. map.has(key) ⇒ key 존재 여부
      4. map.delete(key) ⇒ key에 해당하는 값 삭제
      5. map.clear() ⇒ map 초기화
      6. map.size ⇒ map의 크기
  2. Set
    • 중복을 허용하지 않음
    • 메소드
      • new Set(), new Set(배열)
      • set.add(value) ⇒ value 추가
      • set.has(value) ⇒ value 포함하는지
      • set.delete(value) ⇒ value 삭제
      • set.clear() ⇒ 초기화
      • set.size ⇒ 요소의 개수

모듈


  • 모듈화 : 공통된 기능이나 특별한 목적으로 분할
    • 효율적 관리, 재사용

모듈 파일의 조건


  1. 독립적인 스코프(모듈 스코프)

    • 모듈 파일 내에서의 변수는 해당 파일 내에서만 사용
    • 지키지 않는 경우 덮어씌워지거나 SyntaxError등 문제 많음.
  2. 모듈 스코프를 만들어주려면

    • type에 module 설정

      <script type="module" src="js파일 경로"></script> 
      // 에러 발생 => 로컬파일 안됨, 웹 서버를 통해 script 실행해야 함
    • VSCODE의 Live Server 확장 프로그램 설치 → 우측 하단의 go live 통해 간이 서버

모듈 문법


export const p = 'hh';
export function f(value) {
    return value;
}

import {p, f} from './myjs.js';
  • export 키워드를 써주면 외부로 내보낼 수 있음

  • import를 통해 불러올 수 있음.

  • import 시 rename

    • as 키워드 사용하여 이름 변경

      import {p as newname, f as newname2} from './myjs.js'
  • 모든 대상을 한번에 import

      import * as myjsobj from './myjs.js'; // export하는 모든 요소 한번에 import
    
      myjsobj.p
      myjsobj.f
    
      // 한번에 export
      export { p as variables, f as function }; 
      // 선언문 앞의 export 키워드들 지우고 맨마지막에 한번
      // 여기서는 * 쓰면 안되요.
  • default export

      export default 'aabb'; // 모듈 내에서 단 한번만 사용 가능, 하나의 값만
      import { default as a } from './myjs.js'; // default는 반드시 as 사용해주어야 함
      import a, {b, c} from './myjs.js'; // 중괄호 없는것을 default
    
      import * as p from './myjs.js';
      p.default // default
    
      export default { a, b } // default = 객체 { a:a, b:b }
    
      import obj from './myjs.js'; // 중괄호 없으면 default keyword이므로 obj에 { a, b }
      import {default as obj} from './myjs.js' // 위와 똑같은 소스

'Language > JavaScript' 카테고리의 다른 글

[ JavaScript ] 웹 기초  (0) 2021.07.31
[ JavaScript ] 객체지향 프로그래밍  (0) 2021.07.30
[ JavaScript ] 함수, 표기법, 예외 처리  (0) 2021.07.29
[ JavaScript ] 데이터 타입  (0) 2021.07.29
[JavaScript] 몰랐던 문법  (0) 2021.07.26

JavaScript


  • 함수 선언을 값처럼 → 함수 표현식
  • 함수 선언 : 호이스팅, 함수 내에서 선언된것이 아닌 코드블록 내에서는 전역변수처럼 사용
  • 함수 표현식 : 호이스팅되지 않음, 스코프 존재, 선언 이후에만 호출 가능.
  • 둘중 한가지 방식으로 일관되게 사용하는것이 좋음, 함수 선언이 조금 더 권장
function 함수(파라미터) { // 함수 선언
    return 리턴값;
}

const p = function() { // 함수 표현식
    return 리턴값;
};

btn.addEventListener('click', function() {
    ...
});

Named Function Expression(기명 함수 표현식)


  • 재귀 함수에서는 기명 함수 표현식을 쓰는것이 좋음.
  • 재귀함수 사용 시 사용하려는 함수가 null이 되버리면 문제가 되므로 네이밍을 다르게 해준다.
const func = function test() {
  ...
}

test() // Error

const factorial = function (n) {
    if (n <= 1)
        return 1
    return n * factorial(n-1);
}

let f = factorial;
factorial = null;
t = f(5) // => 오류

const factorial = function fact(n) {
    if (n <= 1)
        return 1
    return n * fact(n-1);
}

let f = factorial;
factorial = null;
t = f(5) // 에러 x

즉시 실행 함수


  • 함수가 선언된 순간 바로 실행 (IIFE)
  • Immediately Invoked Function Expression
  • 외부에서 사용 불가능, 재귀함수로 만들 때는 이름 필요
(function func() {
    실행문
})();

func(); // 에러 발생

(function init() {
    // 초기화
})();

const fact = (function factorial(n) { // 재귀함수 만들때 이름 및 변수에 바로 리턴값 저장
    if (n <= 1)
        return 1
    return n * factorial(n-1);
})(5); // 입력한 매개변수가 위 인자로 들어감

함수 값


  • typeof 함수 ⇒ function, 함수는 객체
  • 파라메터에 함수이름 ⇒ 콜백 함수
  • 함수를 리턴할 수도 있음.
function a(b, c) {
    return b() + c()
}

function f1() {
    return 1;
}

function f2() {
    return 2;
}

a(f1, f2) // f1, f2를 콜백함수라고 함

function a(b, c) {
    return function() {
        return b() + c(); // 여기서 b + c 하면 함수 코드 문자열 자체가 더해지는듯..
    };
}

function f1() {
    return 1;
}

function f2() {
    return 2;
}

console.log(a(f1, f2)()) // 괄호를 하나 더 써줘서 바로 함수 호출하도록

Parameter


  • 함수 선언에서 function a(b,c) 에서 b,c는 파라메터
  • a('1', '2')에서 '1', '2'는 argument
  • 파라메터에 기본값 적용 가능
    • function a(b='1', c)
    • 기본값 없으면 전달 안되었을 시 undefined
  • argument는 순서대로 전달
  • undefined 전달시 기본값 사용
    function a(b=100, c=b+50) { 
      console.log(b + c); 
    } 
    a(undefined, undefined); // 250

Argument


  • 함수 호출시 a(b, c)에서 b,c는 argument

  • Argument의 개수에 따라 유연하게 동작하는 함수

      function a(b, c, d) {
          arguments // argument에 어떤것들이 전달되었는지
          for (let arg of arguments) {
              console.log(arg);
          }
      }
    
      a('a', 'b', 'c', 'd')
    • 따라서, 변수/함수명을 arguments로 지어서는 안됨!!
  • 파라메터의 개수보다 적거나 많이 입력하더라도 입력한 개수만큼 출력

  • 유사배열 → 배열의 메서드 사용 불가능

  • 인덱싱을 통한 세분화가 필요함.

Rest Parameter


  • ...변수명으로 선언
  • args가 배열이므로 배열의 메서드들 사용 가능
  • 일반 파라메터와 함께 사용 가능, 하지만 앞에 정의된 파라메터에 argument를 먼저 할당하고 나머지 argument를 배열로 묶으므로 가장 마지막에 선언해주어야 함
function a(...args) {
    arguments // argument에 어떤것들이 전달되었는지
    for (let arg of args) {
        console.log(arg);
    }
}

a('a', 'b', 'c', 'd')

function a(...args) { // 단 3개만 나오도록
  let temp = args.slice(0, 3);
    for (let arg of temp) {
        console.log(arg);
    }
}

a('a', 'b', 'c', 'd')
// 맨 앞 아규먼트만 빼고 나머지 출력하기
function ignoreFirst(a, ...args) {
  for (let arg of args) {
    console.log(arg)
  }
}

function ignoreFirst(...args) {
    args.shift()
  for (let arg of args) {
    console.log(arg)
  }
}

Arrow Function


  • 파라메터 1개 → 소괄호 생략 가능
  • 파라메터가 없거나 2개이상 → 소괄호 필수
  • return문 한개만 존재한다면 return문도 생략 가능
  • return문 외에 다른 구문 필요시 생략 불가능
  • return문이 객체인 경우는 함수의 중괄호와 헷갈릴 수 있으므로 () 감싸주어야 함.
  • arguments 객체 사용하는 경우는 Arrow Function으로 바꾸기 어려움.
  • rest parameter은 사용 가능.
const calc = (a, b)=>{
    return a + b;
}

const calc = (a,b) => a+b;

const calc = (a,b) => ({answer: a+b}); // 소괄호 빼면 오류

This


  • this : 함수를 호출하는 객체를 가르키는 키워드
    • 호출한 객체에 따라 값이 달라짐.
  • Arrow Function에서의 this는 arrow function이 선언되기 직전에 유효한 this 값
  • 다른 객체(a)의 메소드에서 this를 사용하더라도, 또다른 객체(b)가 해당 메소드(a.f)를 가져와서 사용하는 경우 this에는 b가 들어간다.
console.log(this) // window

const obj = {
    a: "11",
    b: "22",
    f: function () {
        console.log(this)
    }
}

const obj2 = {
    a: "112",
    b: "223",
    f: function () {
        console.log(this)
    },
      f2: obj.f
};

obj.f(); // obj
obj2.f(); // obj2
obj2.f2(); // obj2

조건 연산자


  • if문을 간결하게 표현
  • 표현식 ? true일때 : false일때
if (조건) {
} else {
}

switch(변수) {
    case 1:
        break
    default:
}

// 조건 ? truthy일때 표현식 : falsy일때 표현식

function half(i) {
    return i>50 ? true : false;
}

console.log(half(10)) // false

Spread 구문


  • 배열의 요소를 펼쳐줌
const numbers = [1, 2, 3]

console.log(...numbers); // 1,2,3으로 출력됨.
console.log(1, 2, 3)
  • slice()로 배열 복사해야 하는 문제점 해소 및 배열 concat시 사용
const numbers = [1, 2, 3]
const numbers_copy = [...numbers, 4]
const numbers2 = [4, 5, 6]
const numbers_concat = [...numbers, ...numbers2]

function a(b, c, d) {
    return b + c + d;
}

a(...numbers); // spread, numbers를 여러개의 값으로 펼침

// ...numbers를 일반 변수에 대입 X

console.log({...numbers}) // 객체화 하는 경우 0:1, 1:2, 2:3 이런식으로 ..
  • 객체 Spread
    • 해당 객체의 프로퍼티들이 펼쳐지면서 복사 가능
      const p = { 'a': 1, 'b': 2 } const q = { ...p, 'c': 3 }
    • 새로운 배열 생성 / 함수 아규먼트 사용 불가능 (배열 spread는 가능)

모던한 프로퍼티 표기법


  • 프로퍼티명과 변수/함수명이 같은 경우 프로퍼티명만 써주어도 됨.

  • const a = 'a'; const b = 'b'; const c = 'c'; const obj = { a, // == a:a b, c, }; console.log(obj)

  • 객체 내부에서 function 선언하는 경우 :(콜론 기호)와 function 키워드 생략 가능

      const obj = {
          c() {
              return 5;    
          }
      }
    
      obj.c();
  • ⇒ 함수 이름이 반드시 필요하기 때문에 Arrow Function 사용시도 이름 써주어야 함.

  • 프로퍼티명을 표현식으로

    const obj = { //[표현식]:값 
      ["a" + "b"]:1 
    }

옵셔널 체이닝


  • 중첩 객체에서 프로퍼티 확인 방법

    • a객체 내부의 b객체가 null이나 undefined라면 undefined 리턴

    • 아니라면 a.b.c 리턴

      const a = 'a'
      const b = 'b'
      const obj = {
        a,
        b,
        c: {
            d: 'hello world!'
        }
      }
      
      const obj2 = {
        a,
        b,
      }
      
      function check(obj) {
        return obj.c?.d;
      }
      
      console.log(check(obj)) // hello world!
      console.log(check(obj2)) // undefined
        function check(a) { 
          return a.b?.c; 
        }

Destructuring(구조 분해)


  • 배열 순서에 따라 값 매핑

    const arr = ['a', 'b', 'c', 'd'] 
    const [r1, r2, r3, r4] = arr // 인덱스에 따라 순서대로 할당, arr이 더 길더라도 순서대로만 
    const [r1, r2, r3, ...r4] = arr // r1~r3은 순서대로 할당, 나머지 값들은 r4에 넣어줌 
    const [r1='1', r2, r3, r4] = arr // 기본값 입력 가능 
    // Destructuring을 활용한 swap 
    let a = 10; 
    let b = 15; 
    [a, b] = [b, a] 
    console.log(a + "//" + b) 
    // 만약 arr의 길이가 더 짧다면 매핑 안되는 부분은 undefined 
    /* r1 = arr[0] r2 = arr[1] r3 = arr[2] */`
  • 객체 Destructuring

    • 프로퍼티 이름에 대해 매핑
    • Rest → {프로퍼티명, ...프로퍼티명} = 객체
      const obj = { a: 'a' b: 'b' } 
      const { a, b } = obj //
      const { a: d, b: e} = obj // d, e로 선언(이름 지정) 
      // 객체 내부에 변수 이름으로 사용할수 없는 프로퍼티명이 있는 경우 반드시 필요 
      // [] 사용하여 표현식 쓸수 있음. 
      const { a: d, b: e, c=123 } = obj // 기본값 지정 
      const { a, ...rest } = obj
      console.log(a) 
      console.log(b)
      

    ```

    • 파라메터에서 Destructuring → DOM 이벤트 다룰때 유용하게 사용 가능에러


      • 자바스크립트에서 에러 발생시 프로그램이 멈춰버리는 문제

      • 에러 객체의 프로퍼티

        • name
        • message
        const myerror = new TypeError('Type Error가 발생했습니다.');
        myerror.name
        myerror.message
        
        throw myerror; // 에러 발생시키기
      • Try - catch문

        • Try문에서도 에러 발생 이후의 코드는 실행되지 않음. 바로 catch로 넘어감
        • 에러 발생시 catch문으로 바로 내려감
        • 프로그램이 종료되지 않음.
        • 실행조차 안되는 코드는 실행되지 않음(문법 에러 등)
          try { 
          // 코드 
          } catch (error) { // 에러 발생시 동작 // 
          console.error => 실제 에러처럼 출력 가능 
          } 
          Finally
          • 최종적으로 실행될 코드를 다룰 때 활용
          • 에러 유무와 관련 없음. 무조건 실행.
          • finally에서 에러가 발생하는 경우 중첩 try-catch문으로 해결 가능
              button.addEventListener('click', (event) => { event.target.toggle('a') });
            button.addEventListener('click', ({target}) => { target.classList.toggle('a') }); 
            button.addEventListener('click', ({target}) => { const {classList} = target; classList.toggle('a'); });                         button.addEventListener('click', ({target: { classList }}) => { classList.toggle('a') });

'Language > JavaScript' 카테고리의 다른 글

[ JavaScript ] 객체지향 프로그래밍  (0) 2021.07.30
[ JavaScript] 배열, 모듈  (0) 2021.07.29
[ JavaScript ] 데이터 타입  (0) 2021.07.29
[JavaScript] 몰랐던 문법  (0) 2021.07.26
[JavaScript] 이벤트 처리  (0) 2021.07.26

데이터 타입


기본형

  • Number
  • String
  • Boolean
  • Symbol → 유일한 값
  • BigInt → 아주 큰 숫자를 다룰 때
  • Null
  • Undefined

참조형

  • object

Symbol, BigInt


  • Symbol

    • 유일한 값을 가진 변수 이름

      const symbol = Symbol('aa')
    • 다른 어떤 값과 비교해도 true가 될 수 없는 고유한 변수

    • 똑같은 설명 붙이더라도 False

  • BigInt

    • 기본적으로 JS는 253-1 ~ 253+1, 해당 범위보다 큰 정수 표현할 때 사용됨.

    • 정수형 뒤에 알파벳 n 붙이거나 BigInt 함수 사용

      90512512521512n
      BigInt(90512512521512)
    • 소수 표현 사용 불가능 (1.5n같은 경우 사용 x)

    • 소수 리턴되는 연산은 소숫점 아래 버림

      10n / 6n // 1n
    • BigInt끼리만 연산 가능, 서로 다른 타입의 경우 명시적 타입 변환 해주어야 함.

      5n * 6n
      5n * 6 // 에러
      5n * BigInt(6)
      Number(5n) * 6

typeof


  • typeof(a), typeof a 두가지로 사용 가능
  • typeof null → object
  • typeof function → function

Boolean


  • Falsy 값 : false, null, undefined, NaN, 0, '' ⇒ False 처리
  • Truthy 값 : Falsy값이 아닌 나머지 값 ⇒ True 처리

AND/OR


  • AND
    • 왼쪽값이 True이면 오른쪽값 리턴
    • 왼쪽값이 False이면 왼쪽값 리턴
  • OR
    • 왼쪽값이 True이면 왼쪽값 리턴
    • 왼쪽값이 False면 오른쪽값 리턴

NULL 병합 연산자(??)


  • const example = null ?? 'a';
    • 왼쪽에 null이나 undefined → 오른쪽 값 리턴
    • 왼쪽이 null이나 undefined가 아님 → 왼쪽 값 리턴
    • FALSY값 확인하는게 아닌것에 유의 !!

변수와 스코프


  • var : 비권장
    • 변수를 만들기도 전에 사용 가능한 문제(hoisting)
    • 중복 선언 가능한 문제
    • 함수가 아닌 조건문, 반복문 내에서 선언한 변수도 사용가능한 문제
  • let, const : 권장
    • 변수 만들기 전에는 접근 불가능
    • 중복 선언 불가능
    • 코드 블록 범위

'Language > JavaScript' 카테고리의 다른 글

[ JavaScript] 배열, 모듈  (0) 2021.07.29
[ JavaScript ] 함수, 표기법, 예외 처리  (0) 2021.07.29
[JavaScript] 몰랐던 문법  (0) 2021.07.26
[JavaScript] 이벤트 처리  (0) 2021.07.26
[JavaScript] 배열  (0) 2021.07.25

숫자 정렬

  • 자바스크립트의 경우, 정렬 시 아스키코드 순 정렬되어 숫자 두자리 이상인경우 정렬이 잘 안되는 문제
  • 이러한 점을 해결하기 위해, 비교함수 지정
      statues.sort(function(a, b){
          return a - b;
      })

'Language > JavaScript' 카테고리의 다른 글

[ JavaScript ] 함수, 표기법, 예외 처리  (0) 2021.07.29
[ JavaScript ] 데이터 타입  (0) 2021.07.29
[JavaScript] 이벤트 처리  (0) 2021.07.26
[JavaScript] 배열  (0) 2021.07.25
[JavaScript] 객체  (0) 2021.07.25

+ Recent posts