728x90
// 매개변수 패턴 (Parameter pattern)
// 기본값 (Default value)
function sum(a, b) { // parameter == 매개변수
return a + b
}
console.log(sum(1, 2)) // argument == 인자 == 인수 // 3
console.log(sum(7)) // a = 7, b = undefined => 7 + undefined == NaN (Not a Number)
// 인자값이 들어 오지 않는 경우를 대비 해서 기본 값을 지정 할 수 있다.
function sum2(a, b = 1) {
return a + b
}
console.log(sum2(7)) // 8
// 인자값이 다 들어오면 기본값 설정 값은 작동 하지 않는다.
const user = {
name: 'Hwanii',
age: 28
}
function getName(user) {
return user.name
}
console.log(getName(user)) // Hwanii
// 구조 분해 할당 문법 으로 작성 해보자.
const user2 = {
name: 'Calm',
age: 96
}
function getName2(user2) {
const {name} = user2 // 객체 구조 분해 할당 문법
return name
}
console.log(getName2(user2)) // Calm (인자로 user2 라는 객체 데이터 자체를 넣기)
// 근데 getName2(user2) 의 매개변수 자체가 객체 데이터 니까,
// 그냥 저기다가 객체 구조 분해 할당 문법을 바로 작성 하여,
// 코드를 줄일 수 있다.
// getName3() 함수가 호출 될 때, 인자값은 객체 데이터 이고,
// 이 객체 데이터를 구조 분해 해서,
// 객체의 name 이라는 속성의 값을 꺼내서,
// 반환값으로 name 이라는 속성의 값을 return 한다.
function getName3({name}) {
return name
}
console.log(getName3(user2)) // Calm
function getEmail({email}) {
return email
}
console.log(getEmail(user2)) // undefined => user2 객체에 email 이라는 속성이 없으므로.
// 없는 속성을 인자로 넣어지는 상황을 방지 해서,
// 객체 구조 분해 할당 문법에서 기본 값을 할당 할 수 있다.
function getEmail2({email = '이메일이 없습니다.'}) {
return email
}
console.log(getEmail2(user2)) // 이메일이 없습니다.
// 배열 구조 분해 할당 문법도 확인 해보자.
const fruits = ['Apple', 'Banana', 'Cherry']
function getSecondItem(array) { // 매개변수 array가 fruits 라는 배열 데이터를 받음.
return array[1]
}
console.log(getSecondItem(fruits)) // Banana
// 위는 평범한 배열 데이터를 함수를 통해 console.log 를 통해 데이터를 출력 하는 코드 이다.
function getSecondItem2([a, b, c]) { // 매개변수로 배열 데이터의 구조를 작성 한다.
return b
}
console.log(getSecondItem2(fruits)) // Banana
// 그런데, 원하는 데이터는 1번째 인덱스의 요소 값 이니까,
// 아래와 같이 작성 할 수도 있다.
function getSecondItem3([, b]) { // , (콤마) 를 작성해 줘야 인덱스 판단이 가능 하다.
return b
}
console.log(getSecondItem3(fruits)) // Banana
// [ 정리 ]
// 정리하면, 앞에서 배웠던, 구조 분해 할당 문법을 매개변수 에서 사용 할 수 있다.
// 따라서, 코드를 더욱 간략히 작성 할 수 있다.
// 마지막 짚고 넘어 가기.
// 아래와 같이 numbers 라는 숫자 데이터 7개를 요소로 가지고 있는 배열을 정의 하고,
// testArray 라는 함수의 매개변수로
// [, , c] 라고 배열 구조 분해 할당 문법을 사용 하면,
// 2번째 인덱스에 있는 요소를 반환 하게 된다.
const numbers = [1, 2, 3, 4, 5, 6, 7]
function testArray([, , c]) {
return c
}
console.log(testArray(numbers)) // 3
// 나머지 매개 변수 (Rest parameter)
function sum3(a, b, ...rest) { // ... 을 작성 한다. => 전개 연산자.
console.log(rest)
}
// 현재 sum2 함수의 매개변수는 a, b ...rest 이다.
// 그러면, sum2 함수의 인자를 2개까지는 매개변수로 받고,
// 나머지 인자는 모두 전개 연산자 ... 이 붙어 있는 rest 라는 변수에 들어 가게 된다.
// 그러면 기본적으로 배열 데이터의 구조로 인자의 값이 들어 가게 된다.
// 암튼 인자 값을 줬지만, 파라미터가 인자의 개수와 동일 하지 않으면,
// 인자 값은 모두 전개 연산자가 붙은 rest 라는 변수의 배열 데이터의 요소가 된다.
console.log(sum3(1, 2)) // 3
console.log(sum3(1, 2, 3, 4)) // 10
console.log(sum3(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) // 55
// 그런데 함수 이름이 sum2 이니까, 인자로 들어온 모든 데이터를 더하고 싶은데,
// 이때, 배열 데이터를 더하는 메서드가 존재 한다.
// => reduce (표준 내장 객체인 배열 데이터를 다루는 메서드)
// accumulator : '값이 누적 된다' 라는 의미 => acc
// current : '현재 데이터' 를 의미 => cur
function sum4(...rest) {
console.log(rest)
console.log(arguments)
return rest.reduce(function (acc, cur) { // reduce 메서드의 인자로 콜백 함수를 넣어 준다.
return acc + cur
}, 0) // 콜백 함수가 끝나는 곳에 , (콤마) 와 숫자 0 을 작성 한다. (숫자 0은 최초 값을 의미 한다)
}
console.log(sum4(1, 2)) // 3
console.log(sum4(1, 2, 3, 4)) // 10
console.log(sum4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) // 55
// [ 참고 ]
// reduce 메서드는 주체가 되는, 배열 데이터의 아이템 (요소) 개수만큼 콜백 함수를 실행 한다.
// 만약 rest 라는 배열 데이터의 요소로 숫자 1 하고 2 가 있다고 하면,
// reduce 메서드의 콜백 함수는 총 2번이 호출 된다.
// 처음에 콜백 함수 뒤에 0을 작성 했으니까,
// acc는 0 이고, cur은 배열 데이터의 첫번째 요소의 값이 1 이니까,
// 저 둘을 더 한 값을 return 키워드를 통해 반환 한다.
// 그러면, 이 반환된 숫자 1은 다시 두번째 함수가 반복 될 때,
// acc의 값이 되고 acc는 그러면 숫자 1이 된다.
// 배열 데이터의 두번째 요소의 값이 2 이니까,
// acc = 1 과 cur = 2 의 값을 더하면 3이 되고, 그것을 반환 한다.
// 최종적으로 더이상 배열에 요소가 없기 때문에,
// 그 더한 값을 return 키워드를 통해 반환 하게 된다.
// [ 정리 ]
// reduce 라는 메서드는 그냥 이런 기능을 하는 구나 정도만 알고 넘어 가면 되고,
// rest 라는 이름으로 변수 앞에 전개 연산자... 을 작성 해서,
// 매개변수 자리에 작성이 가능 하다는 것을 보면 된다.
// 그리고 자바스크립트는 나머지 매개변수를 통해서 데이터를 받지 않아도,
// 들어오는 모든 인자의 정보를 가지고 있는,
// 이미 선언이 되어 있는 객체가 존재 한다.
// console.log(arguments) 를 작성 하면 확인 할 수 있다.
// [ 참고 ]
// 이 arguments 라는 객체는 데이터는 배열 데이터는 아닌데,
// 배열 데이터 처럼 출력 되어 보인다.
// 그래서 이것을 '유사 배열' 이라고 한다. => Array-Like
// 얘는 어디 까지나 유사 배열 이기 때문에, 활용도가 사실상 낮아서,
// rest 라는 파라미터를 작성 하고, 그 앞에 ... 전개 연산자 를 사용 해서,
// 배열 데이터로 활용을 하는 것이 효과적 이라고 할 수 있겠다.
// 이렇게 유사 배열 이라는 개념이 존재 한다는 정도만 알고 넘어 가면 될듯 ?
반응형
'자바스크립트 (JavaScript) > 이론' 카테고리의 다른 글
[ 함수 ] 즉시실행함수 (IIFE) (0) | 2023.11.06 |
---|---|
[ 함수 ] 화살표 함수 (2) | 2023.11.06 |
[ 함수 ] 반환 및 종료 (0) | 2023.11.05 |
[ 함수 ] 선언과 표현 그리고 호이스팅 (0) | 2023.11.05 |
[ 연산자와 구문 ] While, Do while 반복문 (0) | 2023.11.05 |