본문 바로가기

JavaScript/강의

[Udemy] [23-2] JavaScript의 최신 기능들 (REST, Destructuring)

 

236. REST  (spread와 비슷하지만 다름!)

 

* 인수객체 (The Arguments Objects)

모든 함수 내에서 사용가능한 array 형태의 객체.

 > length 속성 사용가능.

 > array 메소드(push/pop) 사용불가.

 > 화살표함수(arrow function) 에서 사용불가.

 

function num() {
    console.log(arguments);
}

num();
//  Arguments [callee: ƒ, Symbol(Symbol.iterator): ƒ]
//  undefined
//  인수(Arguments)가 비어있음


num(10, 9, 8);
//  Arguments(3) [10, 9, 8, callee: ƒ, Symbol(Symbol.iterator): ƒ]
//  0 : 10
//  1 : 9
//  2 : 8

=> 인수가 있는 경우 index와 함께 요소가 나열됨 (배열형태)  _하지만 배열은 아니기 때문에 배열메서드 사용불가

 

Arguments가 없는 경우 / length는 0

 

Arguments가 3개 있는 경우 / length는 3

 


 

모든 요소(인수)들을 더하는 메소드를 만들어보자.

function nums() {
    return arguments.reduce((total, el) => total + el )
}

nums(10, 9, 8)
// Uncaught TypeError: arguments.reduce is not a function

인수객체는 배열 형태일 뿐 배열은 아님!  reduce 메서드 사용불가.

=> REST PARAMS 활용 (모든 인수들을 배열로 모아줌)

 

function nums(number) {	
    console.log(number);
}
// 인수가 하나

nums(10, 9, 8)
// 10
// 첫번째 인수 하나만 받음

REST를 사용하면

function nums(...number) {	
    console.log(number);
}

nums(10, 9, 8)
// (3) [10, 9, 8]
// 배열로 리턴

=> number라는 배열로 리턴!

 

function nums(...number) {
    return number.reduce((total, el) => total + el )
}

nums(10, 9, 8)
// 27

=> 배열이기 때문에 reduce 메서드 사용가능.

 


 

[ Destructuring ]

* 관련 참고

 

237. 배열 분해 ( Array Destructuring)

const group = ['A', 'B', 'C', 'D', 'E'];

const [first, second] = group;

console.log(first)	// A
console.log(second)	// B

=> 배열 group의 요소를 순서대로 새로운 변수에 지정.

 

const group = ['A', 'B', 'C', 'D', 'E'];

const [first, second, ...everyoneElse] = group;

console.log(everyoneElse)	// (3) ['C', 'D', 'E']

=> rest 연산자 사용.

 

rest 연산자 : 나머지 요소들을 하나의 배열로 그룹화. 

* spread 연산자 : 배열이나 객체의 요소를 개별 요소로 확산. 

 

 

238. 객체분해 (Object Destructuring)

const person = {
    name: 'pyo',
    age: 30,
    password: 'pw123',
    city: 'seoul'
}

const {name, age, city} = person;


console.log(name);		// pyo
console.log(age);		// 30
console.log(city);		// seoul

=> 객체의 값을 기반으로 새로운 변수에 할당. (객체의 key값과 동일한 변수이름에 할당) 

 

const person = {
    name: 'pyo',
    age: 30,
    password: 'pw123',
    city: 'seoul'
}

const {name: firstName, city: addr} = person;


console.log(firstName);		// pyo
console.log(addr);		// seoul

=> 객체의 값을 기반으로 새로운 변수에 할당.  (객체의 key값이 아닌 다른 변수이름에 할당)


 

const person = {
    name: 'pyo',
    age: 30,
    password: 'pw123',
    city: 'seoul'
}

const {name, password, email} = person;


console.log(email);		// undefined

=> person객체에 'email'에 속성값이 없음.

 

const {name, password, email='N/A'} = person;

console.log(email)	//	N/A

=> 변수에 할당과 동시에 기본값 지정. 

 

const {name, password=98765, email='N/A'} = person;

console.log(password)	//	pw123
console.log(email)	//	N/A

=> 객체에 값이 있는 경우에는 기본값을 무시. (값이 없는 경우에만 기본값을 사용)  

 

 

239. 매개 변수 분해 (Param Destruturing)

(1)

function info(person) {
	return `${person.name}, ${person.password}`
}


info(person);	// 'pyo, pw123'

=> 매개변수 값의 구조를 분해해서 필요한 값만 리턴. 

 

(2)

function info(person) {
	const {name, password} = person;
    // 추가로직
	return `${name}, ${password}`;
}


info(person);	// 'pyo, pw123'

=> 1번 방식과 결과는 같음. (매개변수로 받은 값에 추가적인 로직이 필요하다면 유용)  

 

(3)

function info({name, password}) {
	return `${name}, ${password}`
}


info(person);	// 'pyo, pw123'

=> 객체에서 필요한 값만 매개변수로 전달.

 

function info({name, email = 'pyo@mail.com'}) {
	return `${name}, ${email}`
}


info(person);	// 'pyo, pyo@mail.com'

=> 객체에 값이 없는 경우 매개변수에서 기본값 지정 가능. 

 


 

* 응용 ( filter, map 함수 )

const persons = [
    {
        name: '김빨강',
        age: 25,
        email: 'red@color.com'
    },
    {
        name: '김주황',
        age: 32,
        email: 'orang@color.com'
    },
    {
        name: '김노랑',
        age: 19,
        email: 'yellow@color.com'
    },
    {
        name: '김초록',
        age: 45,
        email: 'green@color.com'
    },
    {
        name: '김파랑',
        age: 8,
        email: 'blue@color.com'
    },
    {
        name: '김남',
        age: 21,
        email: 'navy@color.com'
    },
    {
        name: '김보라',
        age: 35,
        email: 'violet@color.com'
    }
];

 

* filter 함수

persons.filter((person) => person.age < 20)

persons.filter(({age}) => age < 20)	// 구조분해 활용


// 결과값
(2) [{…}, {…}]
0:{name: '김노랑', age: 19, email: 'yellow@color.com'}
1:{name: '김파랑', age: 8, email: 'blue@color.com'}

=> 결과값은 같음.

 

 

* map 함수

persons.map((person) => {
	return `${person.name} is ${person.age} years old.`
})

persons.map(({name, age}) => {
	return `${name} is ${age} years old.`	// 구조분해 활용
})


// 결과값
(7) ['김빨강 is 25 years old.', '김주황 is 32 years old.', '김노랑 is 19 years old.', '김초록 is 45 years old.', '김파랑 is 8 years old.', '김남 is 21 years old.', '김보라 is 35 years old.']
0: "김빨강 is 25 years old."
1: "김주황 is 32 years old."
2: "김노랑 is 19 years old."
3: "김초록 is 45 years old."
4: "김파랑 is 8 years old."
5: "김남 is 21 years old."
6: "김보라 is 35 years old."

=> 결과값은 같음.