이처럼 스프레드 문법의 결과물은 값으로 사용할 수 없고, 다음과 같이 쉼표로 구분한 값의 목록을 사용하는 문맥에서 사용할 수 있다.
함수 호출문의 인수 목록
배열 리터럴의 요소 목록
객체 리터럴의 프로퍼티 목록
35.1 함수 호출문의 인수 목록에서 사용하는 경우
요소들의 집합인 배열을 펼처서 개별적인 값들의 목록을 만든 후, 이를 함수의 인수 목록으로 전달해야하는 경우가 있다.
constarr= [1,2,3];//배열 arr의 요소 중에서 최대값을 구하기 위해 Math.max를 사용한다.constmax=Math.max(arr); //NaN, Math.max 메서드에 숫자가 아닌 배열을 인수로 전달하면 최대값을 구할 수 없으므로 NaN을 반홚나다.//이를 해결하기 위해선 배열 arr을 펼쳐 요소들을 개별적인 값의 목록으로 만든 후 인수를 전달하면 된다constmax=Math.max(...arr);
스프레드 문법은 앞에서 살펴본 Rest 파라미터와 형태가 동일하여 혼동할 수있으므로 주의가 필요하다.
스프레드 문법
여러 개의 값이 하나로 뭉쳐 있는 배열과 같은 이터러블을 펼쳐서 개별적인 값들의 목록을 만드는 것
Rest 파라미터
함수에 전달한 인수들의 목록을 배열로 전달 받기 위해 매개변수 이름 앞에 … 을 붙이는 것
//Rest 파라미터는 인수들의 목록을 배열로 받는다.functionfoo(...rest) {console.log(rest);}//스프레드 문법은 배열과 같은 이터러블을 펼쳐서 개별적인 값들의 목록을 만든다.//[1, 2, 3] -> 1, 2, 3foo(...[1,2,3]);
35.2 배열 리터럴 내부에서 사용하는 경우
스프레드 문법을 배열 리터럴에서 사용하면 ES5에서 사용하던 기존 방식보다 더욱 간결하고 가독성있게 표현 가능하다.
35.2.1 concat
ES5에서 2개의 배열을 1개의 배열로 결합하고 싶은 경우, 배열 리터럴만으로 해결할 수 없고 concat 메서드를 사용해야한다.
스프레드 문법을 사용하면 별도의 메서드를 사용하지 않고 배열 리터럴 만으로 2개의 배열을 1개의 배열로 결합 가능하다.
ES5에서 어떤 배열의 중간에 다른 배열의 요소들을 추가하거나 제거하려면 splice 메서드를 사용한다.
이때 splice 메서드의 세 번째 인수로 배열을 전달하면 배열 자체가 추가된다.
//ES5var arr1 = [1,4];var arr2 = [2,3];//세 번째 인수 arr2를 해체하여 전달해야 된다.//그렇지 않으면 arr1에 arr2 배열 자체가 추가된다.arr1.splice(1,0, arr2); //기대한 결과인 [1, 2, 3, 4]가 아닌 아래 사진과 같은 결과가 나온다.
위에서 기대한 결과를 나타내려면 Function.prototype.apply 메서드를 사용하여 splice 메서드를 호출해야한다.