Search
Duplicate

Spread, Rest

1. spread, Array spread, String spread, Object spread, push(...spread)

spread

Syntax: [...iterable]
[...iterable]
[...처럼 [ ]안에 점(.) 3개를 작성하고 이어서 이터러블 오브젝트를 작성합니다.
const list = [21, 22]; console.log([11, ...list, 12]); [11,21,22,12] const obj = {key: 50}; console.log({...obj}); // {key: 50}
JavaScript
복사
이터러블 오브젝트를 하나씩 전개합니다.
{key: value}의 Object가 이터러블 오브젝트는 아니지만 전개가 가능합니다.

Array spread

spread 대상 배열을 작성한 위치에 엘리먼트 단위로 분리및 전개합니다.
Array spread 작성 형태
const one = [21, 22]; const two = [31, 32]; const result = [11, ...one, 12, ...two]; console.log(result);//[11,21,22,12,31,32]; consoel.log(result.length);//6
JavaScript
복사
값이 대체되지 않고 전개됩니다.
const one = [21, 22]; const result = [11, 12, ...one]; console.log(result);//[11, 12, 21, 22]; console.log(result.length);//4
JavaScript
복사
⇒ 만일 값이 대체되었다면 [11, 12, [21, 22]]로 이차원 배열이 되고 length는 3이되었을 것입니다.

String spread

spread 대상 문자열을 작성한 위치에 문자 단위로 전개합니다.
String spread 작성 형태
const target = "ABC"; console.log([...target]);//[A, B, C]
JavaScript
복사
⇒ target의 ABC를 문자 단위로 분리하여 전개합니다.

Object spread

spread 대상 Object를 작성한 위치에 프로퍼티 단위로 전개합니다.
Object spread 작성 형태
const one = {key1: 11, key2: 22}; const result = {key3: 33, ...one}; console.log(result);//{key3: 33, key1: 11, key2: 22}
JavaScript
복사
⇒ ...one 은 one오브젝트의 프로퍼티를 전개합니다.
프로퍼티의 이름이 같을경우 값을 대체합니다.
const one = {key1: 11, key2: 22}; const result = {key1: 33, ...one}; console.log(result);//{key1: 11, key2: 22} //const check = [...one];
JavaScript
복사
⇒one의 key1과 result의 key1은 프로퍼티 이름이 같기에 뒤에 작성한 one의 프로퍼티 내용으로 대체됩니다. 그래서 key1은 33이 아니라 11이 출력됩니다. ⇒const check = [...one]; one은 빌트인 오브젝트이기에 이터러블 오브젝트가 아니므로 대괄호 형태로 작성하면 에러가 발생합니다.

push(...spread)

push()파라미터에서 spread 대상을 작성할 수 있습니다.
배열 끝에 대상을 분리하여 첨부합니다.
let result = [21, 22]; const five = [51, 52]; result.push(...five); console.log(result);//[21, 22, 51, 52] result.push(..."abc"); console.log(result);//[21, 22, 51, 52, a, b, c]
JavaScript
복사

2. Rest 파라미터, function spread, Array-like, rest와 arguments 차이

function spread

호출하는 함수의 파라미터에 spread대상을 작성합니다.
처리 순서 및 방법
함수가 호출되면 우선, 파라미터 배열을 엘리먼트 단위로 전개
add(...values) → add(10, 20, 30); 이와같이 전개
전개한 순서대로 파라미터 값으로 넘겨줍니다.
호출받는 함수의 파라미터에 순서대로 매핑됩니다.
function add(one, two, three){ console.log(one + two + three); }; const values = [10, 20, 30]; add(...values);//60
JavaScript
복사

rest 파라미터

syntax: function(param, paramN, ...name)
분리하여 받은 파라미터를 배열로 결합합니다.
spread: 분리, rest: 결합
⇒ point(...values) → point(10, 20, 30)이 되어 호출합니다.
⇒ rest파라미터로 다시 결합하여 param = [10, 20, 30]이 됩니다.
function point(...param){ console.log(param); console.log(Array.isArray(param)); } const values = [10, 20, 30]; point(...values);
JavaScript
복사
작성 방법
호출받는 함수의 파라미터에 ...에 이어서 파라미터 이름 작성을 합니다.
호출한 함수에서 보낸 순서로 매핑합니다.
파라미터와 Rest파라미터를 혼합 사용할 수 있습니다.
⇒ point(...values) → point(10, 20, 30)이 되어 호출합니다.
⇒ point에서는 첫번째 파라미터인 10을 ten에 할당합니다.
⇒ 나머지 20, 30을 ...rest 파라미터로 결합하여 최종적으로는 point(10, [20,30])으로 받게 됩니다.
function point(ten, ...rest){ console.log(ten); console.log(rest); }; const values = [10, 20, 30]; point(...values);
JavaScript
복사

Array-like

Object 타입이지만 배열처럼 이터러블 가능한 오브젝트입니다.
for()문으로 전개할 수 있습니다.
작성 방법
프로퍼티key 값을 0부터 1씩 증가하며 프로퍼티 값 작성
length에 전체 프로퍼티 수 작성
const values = {0: "가",1:"나", 2:"다", length: 3}; for(let k = 0; k< values.length; k++){ console.log(values[k]); };
JavaScript
복사
⇒ length 프로퍼티는 전개되지 않습니다.(하면 안됩니다.)
⇒ for~in문으로 전개할 경우 length 프로퍼티도 전개됩니다.

rest와 arguments의 차이점

Argument 오브젝트
파라미터 작성에 관계없이 전체를 설정합니다.
Array-like 형태 Array 메소드를 사용할 수 없습니다.
__proto__가 Object 입니다.
rest 파라미터
매핑되지 않은 나머지 파라미터만 설정합니다.
Array 오브젝트 형태
Array 메소드를 사용할 수 있습니다.
__proto__가 Array