일급 객체(first-class object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다.
다음과 같은 조건을 만족하는 객체를 일급 객체라 한다.
- 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다.
- 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
- 함수의 매개변수에 전달할 수 있다.
- 함수의 반환값으로 사용할 수 있다.
자바스크립트의 함수는 위의 조건을 모두 만족하므로 일급 객체다.
function repeat(n, f) { // 경우에 따라 변경되는 일을 f로 추상화, 외부에서 전달 받음
for (let i = 0; i < n; i++) {
f(i) // i 전달, f 호출
}
}
let logAll = (i) => {console.log(i)};
repeat(5, logAll); // 0 1 2 3 4
let logOdds = (i) => {
if (i % 2) console.log(i);
};
repeat(5, logOdds); // 1 3
이처럼 함수의 매개변수를 통해 다른 함수 내부로 전달되는 함수를
콜백 함수(callback function)
라고 하며, 매개변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수를고차 함수(Higher-Order Function)
라고 한다.
고차 함수는 함수를 전달인자로 받거나 함수를 리턴하는 함수를 말한다.
sort
메서드는 배열의 요소를 정렬한다. 원본 배열을 직접 변경하며 정렬된 배열을 반환한다.sort
메서드는 기본적으로 오름차순으로 요소를 정렬한다.
const alpha = ['b', 'd', 'a', 'e', 'c'];
alpha.sort();
console.log(alpha); // ['a', 'b', 'c', 'd', 'e']
let num = [40, 100, 1, 5, 2, 25, 10];
num.sort();
console.log(num); // [1, 10, 100, 2, 25, 40, 5]
sort
메서드에 정렬 순서를 정의하는 비교 함수를 인수로 전달해야 한다.let num = [40, 100, 1, 5, 2, 25, 10];
num.sort((a, b) => a - b);
console.log(num); // [1, 2, 5, 10, 25, 40, 100]
비교 함수는 양수나 음수 또는 0을 반환해야 한다. 리턴 값이 음수일 경우 비교 함수의 첫번째 인자를 우선으로 정렬하고, 양수일 경우 두번째 인수를 우선하여 정렬한다.
forEach
메서드는for
문을 대체할 수 있는 고차 함수다.forEach
메서드는 반복문을 추상화한 고차 함수로서 내부에서 반복문을 통해 자신을 호출한 배열을 순회하며 수행해야 할 일을 콜백 함수로 전달받아 반복 호출한다.
for
문 사용const num = [1, 2, 3];
const result = [];
for (let i = 0; i < num.length; i++) {
result.push(num[i] ** 2);
}
console.log(result); // [1, 4, 9]
forEach
문 사용const num = [1, 2, 3];
const result = [];
num.forEach(el => result.push(el ** 2));
console.log(result); // [1, 4, 9]
map
메서드는 자신을 호출한 배열의 모든 요소를 순회하며 인수로 전달받은 콜백 함수를 반복 호출하고, 콜백 함수의 반환값들로 구성된 새로운 배열을 반환한다.
const num = [1, 2, 3];
const add1 = num.map(el => el + 1);
const mul2 = num.map(el => el * 2);
console.log(add1); // [2, 3, 4]
console.log(mul2); // [2, 4, 6]
const user = [
{name: 'John', age: 30},
{name: 'Cely', age: 20},
{name: 'Michael', age: 45}
];
const userName = user.map(el => el.name);
console.log(userName); // ['John', 'Cely', 'Michael']
filter
메서드는 자신이 호출한 배열의 모든 요소를 순회하며 콜백 함수를 반복 호출하고, 콜백 함수의 반환값이 true인 요소로만 구성된 새로운 배열을 리턴한다.
const num = [1, 2, 3, 4, 5]
const odds = num.filter(el => el % 2);
console.log(odds); // [1, 3, 5]
const user = [
{name: 'John', age: 30},
{name: 'Cely', age: 20},
{name: 'Michael', age: 45}
];
const legalDrinking = user.filer(el => el >= 21);
console.log(legalDrinking); // ['John', 'Michael']
reduce
메서드는 콜백 함수의 반환 값을 다음 순회 시 콜백 함수의 첫번째 인수로 전달하면서 콜백 함수를 호출하여 하나의 결과값을 만들어 반환한다.
const num = [1, 2, 3, 4, 5];
const sum = num.reduce((acc, cur) => acc + cur);
console.log(sum); // 15
const num = [1, 2, 3, 4, 5];
const max = num.reduce((acc, cur) => acc > cur ? acc : cur);
console.log(max); // 5