Home Java Script | Spread 문법
Post
Cancel

Java Script | Spread 문법

목차

스프레드 문법

  1. spread 문법이 뭔가요?
  2. 어떤 상황에서 사용할 수 있죠?



스프레드 문법

1. spread 문법이 뭔가요?

  1. spread 문법 : 하나로 뭉쳐 있는 여러 값들의 집합을 펼쳐서 개별적인 값들의 목록으로 만듬

    • ES6에서 도입된 문법
    • 대상을 개별 요소로 분리
    • 스프레드 문법을 사용할 수 있는 대상 : Array, String, Set, Dom 컬렉션, arguments와 같이 for …of 문으로 순회할 수 있는 이터러블에 한정
    • 스프레드 문법의 결과는 값이 아니므로 이 결과는 변수에 할당할 수 없음

    • 배열 - 배열 안의 요소들이 전개됨
      문자열 - 문자열의 문자들이 쪼개져서 전개됨

      1
      2
      3
      4
      5
      6
      7
      
      const fruits = ["apple", "banana", "kiwi"];
      const numbers = [1, 2, 3, 4, 5];
      const str = "market";
      console.log(...fruits); // apple banana kiwi
      console.log(...numbers); // 1 2 3 4 5
      console.log(str); // market
      console.log(...str); // m a r k e t
      
    • key : value 형태의 한 쌍 단위의 객체 전개도 가능함

      1
      2
      3
      
      const transport = [{ bus: 4123, walk: 9123, subway: 912 }];
      console.log(...transport); // {bus: 4123, walk: 9123, subway: 912}
      console.log(transport); // [{...}] > {bus: 4123, walk: 9123, subway: 912}
      

    *이터러블 : 반복가능한 객체

  2. Rest 파라미터(= 나머지 매개변수)

    • Rest 파라미터 구문은 구조 분해 할당 문법과 같이 사용하면 나머지 (객체, 배열)을 rest에 담아서 추출할 수 있음
    • 함수에서 정해지지 않은 수의 매개변수를 배열로 받을 수 있음
    • 객체, 배열, 함수의 매개변수에서 사용 가능
    • 객체에서의 rest

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
      // Rest 사용 예) 객체의 경우 1
      const a = {
      one: '하나',
      two: ''
      three: ''
      }
      
      const { three, ...rest } = a;
      
      console.log(three); // '셋'
      console.log(rest); // { one:'하나', two:'둘' }
      
      // rest 안에는 three 값을 제외한 값이 들어있다.
      
    • 배열에서의 rest

      1
      2
      3
      4
      5
      
      // Rest 사용 예) 배열의 경우 1
      const a = [1, 2, 3];
      const [one, ...rest] = a;
      console.log(one); // 1
      console.log(rest); // [2, 3]
      
    • 함수에서의 rest : 함수의 매개변수가 몇 개가 될 지 모르는 상황에서 사용하면 유용함

      1
      2
      3
      4
      5
      6
      
      // Rest 사용 예) 함수 파라미터 1
      function sum(...rest) {
        return rest;
      }
      const result = sum(1, 2, 3);
      console.log(result); // [1, 2, 3]
      


  3. Spread 문법 vs Rest 파라미터

    • 문법적으로는 같아보일 수 있으나 정반대의 기능을 수행함
    • 스프레드 연산자는 인수에 사용 / Rest 파라미터는 매개 변수(변수 선언)에 사용
    • 요소를 하나씩 모두 전개 시킬 때 : Spread
    • 나머지 요소를 묶을 때 : rest

      1
      2
      3
      4
      
      Math.max(...numbers); // 스프레드 연산자 : 함수 호출의 인수
      const max = (...values) => {
        /* 본문 */
      }; // 매개변수의 나머지 변수 선언
      



2. 어떤 상황에서 사용할 수 있죠?

  • 상태의 불변성을 유지하기 위해 사용됨(기존에 메모리에 담겨있던 값이 다시 변경되지 않는 것 => 상태 변화를 빠르게 탐지할 수 있음)
    => 기존의 것은 건들이지 않고 새로운 객체를 만들 때 사용

    1
    2
    3
    4
    
    const obj1 = { name: "John", age: "20", flag: "true", foo: "bar" };
    const newObj = { ...obj1, name: "Alice" }; // { name: 'Alice', age: '20', flag: 'true', foo: 'bar' }
    
    console.log(obj1 === newObj); // false
    
  • 함수 호출문의 인수 목록 : 요소들의 목록을 함수의 인수로 전달하고 싶은 경우

    1
    2
    3
    4
    5
    6
    
    var arr = [1, 2, 3];
    
    //기존
    var max = Math.max.apply(null, arr); //3
    //스프레드 문법
    var max = Math.max(...arr); // 3
    
  • 배열 리터럴의 요소 목록 : 배열 병합, 배열 복사, 이터러블을 배열로 변환(사용 예시 참고)
  • 객체 리터럴의 프로퍼티 목록 : Object.assign 메서드를 사용하여 여러 개의 객체를 병합하거나 특정 프로퍼티를 변경 또는 추가
    -> 스프레드 문법을 활용하면 간단하게 해결됨

    1
    2
    3
    4
    5
    6
    7
    
    //Object.assign
    const merged = Object.assign({}, { x: 1, y: 2 }, { y: 10, z: 3 });
    console.log(merged); // {x:1, y:10, z:3};
    
    //스프레드 문법
    const merged = { ...{ x: 1, y: 2 }, ...{ y: 10, z: 3 } };
    console.log(merged); // {x:1, y:10, z:3};
    


    **사용 예시

    • 배열 병합

      • 기존 : concat 메서드를 이용해 병합
      • 현재 : spread 연산자를 이용 -> 다양한 형태의 배열 병합을 비교적 간단하게 할 수 있음

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        
        // 기존 방식
        var arr1 = [1, 2, 3];
        var arr2 = [4, 5, 6];
        
        var arr = arr1.concat(arr2);
        console.log(arr); // [ 1, 2, 3, 4, 5, 6 ]
        
        // ES6 spread operator
        var arr1 = [1, 2, 3];
        var arr2 = [4, 5, 6];
        
        var arr = [...arr1, ...arr2];
        console.log(arr); // [ 1, 2, 3, 4, 5, 6 ]
        
    • 배열 복사

      • 기존 : slice 또는 map 을 이용하여 배열 복사
      • 현재 : 얕은 복사로 복사된 배열 생성 가능(배열 안에 객체가 있는 경우 : 객체 자체의 복사X -> 원본 값 참조
        => 원본 배열 내의 객체를 변경하는 경우, 새로운 배열 내의 객체 값도 변경됨)

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        
        // 기존 - ES5 map
        var arr1 = ["철수", "영희"];
        var arr2 = arr1.map((item) => item);
        
        arr2.push("바둑이");
        console.log(arr2); // [ "철수", "영희", "바둑이" ]
        // 원본 배열은 변경되지 않습니다.
        console.log(arr1); // [ "철수", "영희" ]
        
        //현재 - ES6 spread operator
        var arr1 = ["철수", "영희"];
        var arr2 = [...arr1];
        
        arr2.push("바둑이");
        
        console.log(arr2); // [ "철수", "영희", "바둑이" ]
        // 원본 배열은 변경되지 않습니다.
        console.log(arr1); // [ "철수", "영희" ]
        



총 정리


스프레드 문법

1. spread 문법이 뭔가요?
하나로 뭉쳐 있는 여러 값들의 집합을 펼쳐서 개별적인 값들의 목록으로 만듬
2. 어떤 상황에서 사용할 수 있죠?
기존의 것은 건들이지 않고 새로운 객체를 만들 때 사용






출처

스프레드 문법
스프레드 문법
스프레드 문법 예시
스프레드 문법과 rest 파라미터
스프레드 문법 사용 이유

This post is licensed under CC BY 4.0 by the author.