Rest 파라미터와 전개구문(Spread syntax)
1. 나머지 매개변수(Rest parameters)
function add(...numbers) {
let result = 0;
numbers.forEach((num) => result += num)
return result
}
add(1,2,3);
add(1,2,3,4,5,6,7,8,9,10);
- 정해지지 않은 개수의 인수를 배열로 나타냄
- 배열이기 때문에 배열 메소드 사용 가능
- 몇개의 인자를 전달 받을 지 모를 때 사용
function User(name, age, ...skills){
this.name =name;
this.age = age;
this.skills = skills;
}
const user1 = new User('somin', 26, 'html', 'css')
const user2 = new User('KKAKKA', 26, 'English')
console.log(user1)
console.log(user2)
1) 매개변수(parameters)
function showName(name) {
console.log(name);
}
showName('somin')
showName('somin', 'KKAKKA')
showName()
- 아무것도 입력하지 않으면 undefined 출력
2) 나머지 매개변수(Rest parameters)
function showName(...name) {
console.log(name);
}
showName('somin')
showName('somin', 'KKAKKA')
showName()
- Rest parameters : 출력이 배열로 나타나며 배열이기에 배열 메소드 사용 가능
- 아무것도 입력하지 않으면 [] 출력
3) arguments
function getArgumentsObj() {
return arguments;
}
const argumentsObj = getArgumentsObj("somin", "KKAKKA", "daeseong");
console.log(argumentsObj)
console.log(argumentsObj.length)
console.log(Object.keys(argumentsObj))
console.log(Object.values(argumentsObj))
- arguments : 배열 형태의 객체로 유사 배열이지만 length 외 배열 메소드를 사용할 수 없음
*모든 함수의 실행 시 자동으로 생성되는 '객체'
2. 전개구문(Spread syntax)
1) 형태
let myArr = [3, 4, 5];
let yourArr = [6, 7, 8];
let result1 = [...myArr, ...yourArr]
console.log(result1);
let result2 = [0, 1, 2, ...myArr, ...yourArr, 9, 10]
console.log(result2);
2) 특징 : immutable
let myArr1 = [1, 2, 3];
let myArr2 = [...myArr1];
console.log(myArr1)
console.log(myArr2)
myArr1[1] = 4
console.log(myArr1)
console.log(myArr2)
- 주소가 아닌 값이 복사되므로 기존 배열을 변경하지 않으므로 복사 용이
- 하지만 얕은 복사(shallow copy)이기에 배열/객체 안에 배열/객체의 경우는 주소가 복사되어 원본 데이터 변경
구조분해 할당
- 배열이나 객체의 속성을 분해해 그 값을 변수에 담아 사용
1. 배열 구조분해(Destructing)
let users = ['somin', 'daeseong', 'KKAKKA'];
let [user1, user2, user3, user4] = users;
console.log(user1)
console.log(user2)
console.log(user3)
console.log(user4)
- 기본값을 정해주면 undefined로 인한 오류 예방 가능
let users = ['somin', 'daeseong', 'KKAKKA'];
let [user1='1', user2='2', user3='3', user4='4'] = users;
console.log(user1)
console.log(user2)
console.log(user3)
console.log(user4)
1) 메소드 사용
let str = 'somin daeseong KKAKKA';
let [user1, user2, user3] = str.split(' ')
console.log(user1)
console.log(user2)
console.log(user3)
2) 불필요한 요소 무시
let users = ['somin', 'daeseong', 'KKAKKA'];
let [user1, user2] = users;
console.log(user1)
console.log(user2)
let [user1, ,user2] = users;
console.log(user1)
console.log(user2)
3) 변수의 값 바꿔치기
let a = 1;
let b = 2;
[a, b] = [b, a];
console.log(a)
console.log(b)
2. 객체 구조분해(Destructing)
1) 구조 분해
(1) 예시1
let user = {name: 'somin', age: 26, skill: 'English'};
let {name, age} = user;
let {skill} = user;
console.log(name)
console.log(age)
console.log(skill)
(2) 예시2
let user = {name: 'somin', age: 26, skill: 'English'};
let {name, age, skill: subject} = user;
console.log(name)
console.log(age)
console.log(subject)
2) 변수 이름 바꾸기
let user = {name: 'somin', age: 26};
let {name: userName, age: userAge} = user;
console.log(userName)
console.log(userAge)
3) rest/spread 문법 적용
(1) 예시1
let user = {name: 'somin', age: 26};
let {name, ...age} = user;
console.log(name)
console.log(age)
(2) 예시2
const user = {
name: "somin",
age: 26,
cat: {
name: "KKAKKA",
age: 7,
species: {
name: "British Shorthair",
},
},
};
const changedUser = {
...user,
name: "daeseong",
age: 30,
};
console.log(changedUser)
const changedCat = {
...user,
cat: {
...user.cat,
species: "Black Cat",
},
};
console.log(changedCat)
- ...user의 위치에 따라 내용이 덮어써질 수 있음