ES6에 추가되었으며 배열, 문자, 객체 등 반복 가능한 객체를 개별 요소로 분리하는 기능을 가진 문법이다. (반복 가능한 객체는 찾아봐도 잘 이해가 ..., 예제를 통해 이해하는게 더 빠른거 같다 ..)
const num1 = [1, 2, 3]; console.log(...num1) // 1 2 3 const num2 = [4, 5, 6]; console.log(...num2) // 4 5 6 const num3 = [...num1, ...num2]; console.log(num3) // [1, 2, 3, 4, 5, 6]
...
를 붙여 사용하며 위 예제처럼 단순히 요소를 변환하여 출력하거나 연결, 병합, 복사 등 다방면으로 응용할 수 있다.const num1 = [1, 2, 3]; const num2 = [4, 5, 6];
const num3 = num1.concat(num2) console.log(num3) //
⬇
const num3 = [...num1, ...num2]; console.log(num3) // [1, 2, 3, 4, 5, 6]
concat()
메소드를 사용하였지만, 전개 연산자를 사용했을 경우 위처럼 깔끔(?)하게 작성이 가능해진다.const num1 = [1, 2, 3]; const num2 = [4, 5, 6]; const num3 = ['사과', ...num1, ...num2, '바나나', '딸기']; console.log(num3) // ["사과", 1, 2, 3, 4, 5, 6, "바나나", "딸기"]
splice()
메소드 대신 적용하여 간결하게 코드를 작성할 수 있다.const num1 = [1, 2, 3]; const num2 = [...num1]; // console.log(num2); // [1, 2, 3] // num2[0] = 10; // console.log(num1); [1, 2, 3] //num2의 값을 바꿔도 데이터 변동X (복제 ok) console.log(num2); [10, 2, 3]
concat()
, slice()
메소드처럼 참조 복사가 아닌, 데이터의 복제를 할 수 있다.const person1 = { name: '철수', age: 10 }; const person2 = {...person1} // console.log(person2) // {name: "철수", age: 10} // person2.age = 20 // console.log(person1) // {name: "철수", age: 10} (person2의 데이터를 변경해도 변동 X) console.log(person2) // {name: "철수", age: 20}
assign()
메소드처럼 참조 복사가 아닌, 데이터의 복제를 할 수 있다. 다만 다음과 같은 점을 주의해야 한다.const person1 = { name: '철수', age: 10, hobby: { sports: `soccer` } }; const person2 = { ...person1 }; // console.log(person1);// { name: '철수', age: 10, hobby: { sports: `soccer` } }; console.log(person2);// { name: '철수', age: 10, hobby: { sports: `soccer` } }; // person2.hobby.sports = 'basketball'; // console.log(person1);//{ name: '철수', age: 10, hobby: { sports: `basketball` } }; console.log(person2);//{ name: '철수', age: 10, hobby: { sports: `basketball` } };
위 예제를 기준으로 person2
내부 또다른 객체인 hobby
의 sports
property를 수정하였더니 person1
의 데이터 까지 변경되었다.
결론적으로 객체 내부 또다른 객체의 프로퍼티값까지는 완벽하게 복제되지 않는 것이다. 이렇게 데이터가 복제되는 것을 얕은 복사
라고 한다. 배열 또한 마찬가지로 적용된다. (object.assign()
도 깊은 복사인줄 알았더니, 얕은 복사라고 한다 ...)
✔
얕은 복사
와깊은 복사
에 대해서는 공부를 좀 더 한 후 정리해봐야겠다.
function num(...nums) { console.log(nums); } num(1,2,3,4,5) // [1, 2, 3, 4, 5] (배열 형태로 값이 전달됨을 알 수 있다.)
function print(...nums) { for (const element of nums) { console.log(element); } } print(1, 2, 3, 4, 5); // 1, 2, 3, 4, 5 (for..of문 적용)
function multiple2(...nums) { for (let i = 0; i < nums.length; i++) { const result = i * 2; console.log(result); } } multiple2(1, 2, 3, 4, 5); // 0, 2, 4, 6, 8 (for loop 적용)
함수를 선언할 때, 매개변수를 연산자 형태로 작성한 것을 Rest parameter
이라고 한다.
위 예제들을 통해 매개 변수들이 연산자 형태로 전달할 경우, 배열 형태로 값이 전달됨을 알 수 있다.
function person(name, ...money) { console.log(name, money); } person('yongmin', '가', '나', '다'); // yongmin ["가", "나", "다"]
위처럼 또다른 인자와 같이 사용할 수 있다.
단!!! 주의점으로, Rest parameter는 항상 제일 마지막에 위치해야 한다.
ex) function(para, ...arg){}
-> OK, function(...arg, para)
-> X