Javascript/ES6

Spread 연산자

dongling 2024. 6. 12. 21:45
728x90
반응형

 핵심요약

  • 스프레드 연산자란?
    • 기존 배열이나 객체의 전체 또는 일부를 다른 배열이나 객체로 빠르게 복사
    • ”과 같이 점(.) 세개를 연속해서 작성
    • rest 파라미터
      • 스트레드 연산자를 사용한 것으로 여러 인수를 배열로 받을 때 사용

⚡ 스프레드 연산자

  • 이터러블 오브젝트의 엘리먼트를 하나씩 분리하여 전개함
  • 전개한 결과를 변수에 할당하거나 호출하는 함수의 파라미터 값으로 사용할 수 있다.
[..iterableObject]
function(...iterableObject)
  • spread 연산자는 “…”과 같이 점(.) 세개를 연속해서 작성하고 이어서 이터러블 오브젝트를 작성
  • 대괄호 [] 안에 작성하거나 function(…[1,2])와 같이 호출하는 함수의 파라미터에 작성

문자열

let spreadObj = [..."music"];
console.log(spreadObj);

---------------------------------------------------------
[실행 결과]
["m", "u", "s", "i", "c"]
  • 문자가 하나씩 분리됨

함수 파라미터

  • 함수가 호출되기 전에 파라미터 값을 분리, 전개
  • 호출받은 함수의 파라미터에 이름을 작성하면 저개한 각 엘리먼트 값이 파리미터 이름에 설정됨
const values = [10, 20, 30];
get(...values);

function get(one, two, three) {
	console.log(one + two + three);
};

---------------------------------------------------------
[실행 결과]
60
  • get 함수를 호출하기 전에 [10, 20, 30]을 get(10, 20, 30) 형태로 전개
  • 호출받은 함수 파라미터의one에 10, two에 20, three에 30이 설정됨

🔹rest 파라미터

  • 호출받은 함수의 파라미터에 function(…rest)와 같이 spread 연산자로 파라미터를 작성한 형태를 rest 파라미터라고 함
function(param, paramN, ...rest);
  • 호출하는 함수의 파리미터에 3개의 파리미터 값을 작성하고 호출받은 함수의 파라미터에 파라미터 이름을 하나만 작성하면 2개의 파리미터 값이 설정되지 않았음
  • 이때, rest 파라미터 작성하면 2개의 파라미터 값이 rest 파라미터에 배열 엘리먼트로 설정됨
let get = (one) => {
	console.log(one);
}
get(...[1, 2, 3]);

---------------------------------------------------------
[실행 결과]
1
  • 호출받은 get 함수가 화살표 함수이므로 호출한 함수에서 보낸 파라미터가 arguments에 설정되지 않는다
  • 따라서, [1, 2, 3]에서 2와 3은 받지 못함
  • rest 파리미터를 작성하면 2와 3을 받을 수 있음
let get = (...rest) => {
	console.log(rest);
	console.log(Array.isArray(rest));
}
get(...[1, 2, 3]);

---------------------------------------------------------
[실행 결과]
[1, 2, 3]
true
let get = (one, ...rest) => {
	console.log(one);
	console.log(rest);
}
get(...[1, 2, 3]);

---------------------------------------------------------
[실행 결과]
1
[2, 3]

🗨️ spread와 rest 파라미터 구분

  • 형태는 같지만, 기능이 다름
  • spread 파라미터는 호출하는 함수의 파라미터에 사용하며 배열을 엘리먼트 단위로 전개
  • rest 파라미터는 호출받은 함수의 파라미터를 사용
  • spread 파라미터는 배열을 엘리먼트로 분리, 전개
  • rest 파라미터는 전개된 앨리먼트를 다시 배열에 설정

🔹Array-like

  • Array는 아니지만 Array처럼 사용할 수 있는 Object
let values = {0: "zero", 1: "one", 2: "two", length: 3};
  • {key: value} 형태의 Object 특징을 유지하면서 배열의 특징을 가미한 것
  • key에 0부터 1씩 증가시키면서 값을 부여
  • 포로퍼티 키 값을 일련번호로 사용하는 것이 Object와 형태와 다르다.
  • {length: 3}과 같이 Object 전체 프로퍼티 수를 작성

🔹rest와 arguments 차이

🔸Argument 오브젝트

  • Argument 오브젝트가 Array-like이므로 Array 오브젝트의 메서드를 사용할 수 없다.
  • Object.prototype에 연결된 프로퍼티가 Argument 오브젝트의 proto에 설정되므로 Object 메서드를 사용할 수 있지만, 모든 오브젝트에 Object가 상속되므로 Argument 오브젝트에 한정된 것은 아니다.
  • 화살표 함수에서는 arguments를 사용할 수 없다.
  • 함수 안의 코드를 보아야 arguments의 사용 여부와 사용 부분을 알 수 있어 코드 가독성이 떨어짐
  • 많은 코드를 디버깅하거나 소스 코드를 리팩토링(Refactoring) 할 때 부담이 됨

🔸rest 파라미터

  • 함수 안의 코드를 체크하지 않고 get(one, …rest) 형태만 보더라도 rest 파라미터 범위를 알 수 있어 가독성이 높다.
  • rest 파라미터가 배열이므로 Array 오브젝트의 메서드를 사용할 수 있다.
  • 화살표 함수 블록에서 rest 파라미터를 사용할 수 있다.
  • Argument 오브젝트보다 rest 파라미터가 효율이 높다.
728x90
반응형