Archive

[JS] 삼항연산 / spread / Optional Chaining / Destructuring

manon_e 2021. 9. 22. 21:41
반응형

 

 

 

     


     

     

     

     


    프로퍼티, 메소드 간결하게 표현

     

     

     

    // 변수의 이름과 프로퍼티 네임 같으면 생략가능
    const user = {
    	title,          // = title : title
    	birth           // = birth ; birth
    }

     

    //객체 내부에서 메소드 함수호출시 콜론기호와 function 생략가능
    const user = {
    	firstname,
    	lastname,
        fullname : function() {
          return `{this.firstname} ${this.lastname}`;
      }
    };
    
    >
    const user = {
    	firstname,
    	lastname,
        fullname () {
          return `{this.firstname} ${this.lastname}`;
      }
    };

     

    // 계산된 속성명 (computed property name)
    const user = {
       [표현식] : 값,
    };
    
    >
    const user = {
      ['first'+'name'] : 'value',
    }
    
    console.log(user);
    //{firstname : value}

     

     

     

     

     

     

     

     


     

    삼항 연산자

     

     

    = 조건부 연산자

    조건 ? truthy할 때 표현식 : falsy할 때 표현식

    간단한 if문 대부분 조건연산자로 표현가능 (내부에 변수나 함수선언, 반복문 불가)

     

    const cutOff = 80;
    
    const passChecker = (score) => score > cutOff ? '합격입니다!' : '불합격입니다!';
    
    console.log(passChecker(75));

     

     

     

     

     


     

     

     

     

     

    Spread operator

     

     

    spread operator : 괄호를 제거해주는 연산자 (배열에서 유용) , object 중괄호, array 대괄호 안에서 사용

    rest parameter : function 소괄호

     

    const num = [1,2,3];
    console.log(num)
    //[1,2,3]
    
    const num = [1,2,3];
    console.log(...num)
    //1,2,3

     

     

    문자에 사용하면 한글자씩 출력된다.

    문자는 array자료형과 유사해서 안에 괄호가 쳐져있다고 생각할 수 있다. ( 실제로 비슷한게 아니라 느낌이!!)

    //문자도 array처럼 출력이 가능하다. 
    
    let 문자 = "hello";
    
    console.log(문자[0])
    //출력 : 'h'
    
    console.log(...문자)
    //출력 : 'h e l l o'

     

     

     

     ✔️ array 합치기

     

    const arr1 = [1,2,3];
    const arr2 = [4,5,6];
    
    const arr3 = [...arr1, ...arr2];    //concat대신 가능
    console.log(arr3);
    //출력 : [1,2,3,4,5,6]

     

     

     

    ✔️ array 복사하기

     

    등호를 사용해서 a의 값을 b로 복사하면 값 공유가 일어난다.

    a를 수정하면 b도 값이 똑같이 바뀐다.

    var a = [1,2,3];
    var b = a;

     

    spread로 a의 괄호를 제거한다음 다시 괄호를 씌워주면 값의 공유없이 복사가능하다.

    var a = [1,2,3];
    var b = [...a];

     

     

     

     

    ✔️ Object 합치기 / 복사에 활용

     

    object 두개를 합치고 싶을 때

    var o1 = { a : 1, b : 2 };
    var o2 = { c : 3, 그리고 o1에 있는거 전부.. }
    
    
    // spread활용한다.
    var o1 = { a : 1, b : 2 };
    var o2 = { c : 3, ...o1 };
    console.log(o2);
    // 출력 : o2 = { a : 1, b : 2 , c : 3 }

     

    ? object의 key 값의 중복이 발생하면

     : 무조건 뒤에오는 중복값이 이긴다.

    var o1 = { a : 1, b : 2};
    var o2 = { a : 3, ...o1 };
    console.log(o2);
    //출력 : o2 = { a : 1, b : 2 }

     

     

     

    ✔️ array를 파라미터 형태로 집어넣을 때 활용한다.

    function 더하기(a,b,c){
       console.log(a + b + c)
    }
    
    var 어레이 = [10, 20, 30];
    더하기(...어레이);  //요즘방식
    더하기.apply(undefined, 어레이);  //옛날방식

     

     

    더보기
    //새로운 배열을 만든다거나 함수의 아규먼트로 사용할 수는 없음 > 객체 표현하는 중괄호 안에서 활용
    
    const latte = {
      esspresso: '30ml',
      milk: '150ml'
    };
    
    const cafeMocha = {
      ...latte,
      chocolate: '20ml',
    }
    
    [...latte]; // Error
    
    (function (...args) {
      for (const arg of args) {
        console.log(arg);
      }
    })(...cafeMocha); // Error
    //배열은 객체로 펼칠 수 있음
    const members = ['태호', '종훈', '우재'];
    const newObject = { ...members };
    
    console.log(newObject); // {0: "태호", 1: "종훈", 2: "우재"}
    
    //객체는 배열로 펼칠 수 없음
    const topic = {
      name: '모던 자바스크립트',
      language: 'JavaScript', 
    }
    const newArray = [...topic]; // TypeError!

     

     

     

     

     

     

     


     

    Rest parameter

     

     

     : 함수에 파라미터가 몇개 들어올지 미리 정의가 불가능 할 때 점3개를 붙여주면 파라미터 잔뜩 들어올 수 있다.

      rest 파라미터로 들어온 값은 모두 [ ] 배열로 들어온다.

     

    function 전부더하기(...a){
      console.log(a)
    }
    
    전부더하기(1,2,3,4,5)

     

     

     

     

    Optional Chaining

     

     

     : 객체의 프로퍼티 다룰 때 접근전에 null , undefined 아니라는 것을 검증 > 에러방지

       null, undefined 아니면 프로퍼티 값 리턴 / 맞으면 undefined반환

     

    function name(user) {
     console.log(user.cat?.name);
    }
    
    //삼항연산자로 표현
    function name(user) {
     console.log((user.cat === null || user.cat === undefined)
     ? undefined : user.cat.name);
    }

     

     

     

     

    Destructuring

     

     

    (구조분해) 배열의 요소나 객체의 프로퍼티 값들을 개별변수에 따로 할당

     = array, object 안에 있는 데이터를 빼서 변수로 만들고 싶을 때 쓰는 문법

     

     

    [배열 구조분해]

    const rank = ['one', 'two', 'three'];
    
    const [하나,둘,셋] = rank;     //할당연산자
    
    console.log(하나);
    console.log(둘);
    console.log(셋);
    
    //one, two, three
    //변수의 마지막에 rest para~ 나머지요소 마지막변수에 모두할당됨
    const rank = ['one', 'two', 'three', 'four', 'five'];
    
    const [하나,둘,셋,...쿠폰] = rank;
    
    console.log(쿠폰);
    
    
    //[four,five]
    //배열이 더 많으면 undefined값 할당
    const rank = ['one', 'two', 'three'];
    
    const [하나,둘,셋,넷] = rank;
    
    console.log(넷);
    //undefined
    //기본값 적용가능 (해당 배열없을경우 기본값이 할당)
    const rank = ['one', 'two', 'three'];
    
    const [하나,둘,셋,넷='없음'] = rank;
    
    console.log(넷);
    //없음
    //두변수의 값을 서로 교환
    let macbook = 'hi';
    let ipad = 'bye';
    
    [macbook, ipad] = [ipad, macbook];       //오른쪽 값을 왼쪽에 할당
    
    console.log(macbook)
    //bye

     

     

     

    [객체 구조분해]

    const mackbook = {
     title : '맥북',
     price : 1250000,
     memory : '16GB',
     storage : '1TB SSD 저장장치'
    };
    
    //const title = macbook.title;
    //const price = macbook.price;
    const {title, price} = macbook;    //프로퍼티 네임으로 분해
    const mackbook = {
     title : '맥북',
     price : 1250000,
     memory : '16GB',
     storage : '1TB SSD 저장장치'
     'serial-num' : 'asfefaesfas'                
    };
    
    //const title = macbook.title;
    //const price = macbook.price;
    const {title:product, ..rest} = macbook;    //남은 프로퍼티들을 모아서 하나의 객체로
    //product로 변수네임 변경
    
    //활용가능한 프로퍼티 네임으로 변경해줌
    const {'serial-num':serialNum} = macbook;
    const { [propertyName] : product } = macbook;    //대괄호로 가능
    
    console.log(product);
    console.log(rest);
    
    //나머지 배열의 특징과 비슷

     

     

     

    [event에서 구조분해 활용]

    const btn = document.querySelector('#btn');
    
    btn.addEventListener('click', (event) => {
     event.target.classList.toggle('checked');
    });
    
    //target 프로퍼티 활용
    btn.addEventListener('click', ({target}) => {
     target.classList.toggle('checked');
    });
    
    //target 중첩되서 좀더 분해 
    btn.addEventListener('click', ({target : classList }) => {
     classList.toggle('checked');
    });
    
    //함수내부에서 구조분해 한번더
    btn.addEventListener('click', ({target}) => {
     const {classList} = target;
     classList.toggle('checked');
    });

     

     

     

    [활용]

    //점 표기법
    function printFavoritSong(name, music) {
      console.log(`최근 '${name}'님이 즐겨듣는 노래는 '${music.singer}'의 
      '${music.title}'이라는 노래입니다.`);
    }
    
    //함수내부에서 구조분해해서 변수로 할당
    function printFavoritSong(name, music) {
      const { singer, title } = music;
      console.log(`최근 '${name}'님이 즐겨듣는 노래는 '${singer}'의 '${title}'이라는 노래입니다.`);
    }
    
    //파라미터에서 구조분해
    function printFavoritSong(name, { title, singer }) {
      console.log(`최근 '${name}'님이 즐겨듣는 노래는 '${singer}'의 '${title}'이라는 노래입니다.`);
    }
    
    
    const music1 = { title: '난치병', singer: '하림' };
    const music2 = { title: '너의 모든 순간', singer: '성시경' };
    
    
    printFavoritSong('영훈', music2);
    printFavoritSong('동욱', music1);

     

     

     

     

     

     

     

     

     

     

     

     

    반응형

    'Archive' 카테고리의 다른 글

    package.json 과 package-lock.json 차이  (0) 2021.09.23
    [JS] Error (Try catch & throw)  (0) 2021.09.22
    [JS] querySelector  (0) 2021.09.18
    [DB] C.R.U.D  (0) 2021.09.16
    [DB] MySQL  (0) 2021.09.15