반응형
function sum(a) {
let total = 0;
for(let element of a) { // a가 이터러블이 아니면 TypeError가 일어난다.
if(typeof element !== "number") {
throw new TypeError("sum(): elements must be numbers");
}
total += element;
}
return total;
}
sum([1,2,3]) // => 6
sum(1,2,3) // TypeError: 1은 이터러블이 아님
sum([1,2,"3"]) // TypeError: 인덱스 2는 숫자가 아님
1. 함수의 매개변수
- 선택 사항인 매개변수와 기본 값
: 선언된 매개변수보다 적은 인자로 함수를 호출하면, 인자에 대응되지 않는
매개 변수는 undefined 값이 된다.
// 객체 obj의 열거 가능한 프로퍼티를 배열 a에 추가하고 a를 반환
// a를 생략하면 새 배열을 생성해 반환
function getPropertyName(obj, array) {
if(array === undefined) array = [] //정의되지 않았으면 새 배열을 생성
// a = a || []; 대체 가능
for(let property in obj) array.push(property);
return array
}
//getPropertyName()는 인자 한 개나 두 개로 호출
let obj = {x: 1}, p={y:2, z:3}; //테스트용 객체
let array = getPropertyName(obj); // a==["x"]; obj의 프로퍼티를 새 배열에 담음
getPropertyName(p, array); // a==["x","y","z"]; p의 프로퍼티를 추가
//매개변수 기본값 설정
function getPropertyName(obj, array=[]) {
for(let peroperty in obj) array.push(property);
return array
}
//화살표 함수를 사용
//사각형 크기를 나타내는 객체를 반환
//너비가 제공될 때만 높이를 너비의 두 배로 정함
const retangle = {width, height=width*2} => {{width, height}}
rectangle(1) // => {width:1, height:2}
- 나머지 매개변수와 가변 인자 리스트
1) 정의된 매개변수 보다 더 많은 인자를 써서 함수를 호출
2) 나머지 매개변수(...)는 매개변수에 할당다고 남은 인자를 받아와서 배열로 값을 저장한다.
3) 인자 개수 제한이 없는 함수를 가변 함수라고 한다.
function max(first=-Infinity, ...rest) {
let maxValue = first; // 첫 번째 인자가 가장 크다고 가정
// 나머지 인자를 순회하면서 더 큰 값을 찾습니다.
for(let n of rest) {
if (n > maxValue) {
maxValue = n;
}
}
// 가장 큰 값을 반환
return maxValue
}
max(1,10,100,2,3,1000,4,5,6) // => 1000
- Argument 객체
: ES6 이전에 사용한 가변 인자 함수
function max(x) {
let maxValue = -Infinity;
// 인자를 순회하며 가장 큰 값을 찾아 기억합니다.
for(let i=0; i < arguments.length; i++) {
if(arguments[i] > maxValue) maxValue = argument[i];
}
// 가장 큰 값을 반환
return maxValue;
}
max(1,10,100,2,3,1000,4,5) // => 1000
- 함수 호출과 분해 연산자
1) 분해 연산자 ..는 개별 값이 예상되는 컨텍스트에서 배열이나 문자열 같은
이터러블을 분해합니다.
// 분해 연산자 활용
let numbers = [5,2,10,-1,9,100,1];
Math.min(...numbers) // => -1
// 이 함수는 함수를 받아 래퍼 버전을 반환
function timed(f) {
return function(...args) { // 인자를 나머지 매개변수 배열에 모은다.
console.log(`Entering function ${f.name}`);
let startTime = Date.now();
try {
// 인자를 모두 래퍼 버전에 전달
return f(...args);
}
finally {
// 반환하기 전에 소요된 시간을 출력
console.log(`Existing ${f.name} after ${Date.now()-StartTime}ms`);
}
};
}
// 1과 n 사이의 숫자의 합을 계산
function benchmark(n) {
let sum = 0;
for(let i = 1; i <=n; i++) sum += i;
return sum;
}
// 테스트 합수의 래퍼 버전으로 호출
timed(benchmark)(1000000) // =>500000500000: 숫자의 합
- 함수 인자를 매개변수로 분해
1) 함수를 호출할 때 전달한 인자는 함수 정의 시 선언된 매개변수 할당
2) 매개변수를 대괄호 안에 쓰면, 대괄호 한 쌍마다 배열 값을 받는다고 정의
3) 자바스크립트는 파이썬과 같이 name=value형태로 인자를 전달할 수 없지만,
매개변수에 객체를 정의하면 name=value 비슷한 형태의 인자를 전달 가능
//일반적인 매개변수정의를 통해 인자 전달
function vectorAdd(v1, v2) {
return [v1[0] + v2[0], v1[1] + v2[1]];
}
vectorAdd([1,2], [3,4]) // => [4,6]
// 매개변수 분해하여 인자 전달
function vectorAdd([x1,x2], [x2,y2]) {
return [x1 + x2, y1 + y2];
}
vector([1,2],[3,4]) // => [4,6]
// name=value 형태의 매개변수 전달(1)
function vectorMultiply({x,y}, scalar) {
return { x: x*scalar, y: y*scalar};
}
vectorMultiply({x:1,y:2} 2) // => {x:2, y:4}
// name=value 형태의 매개변수 전달(1)
function vectorAdd(
{x: x1, y: y1}, // 첫 번째 객체를 x1, y1 매개변수 분해
{x: x2, y: y2} // 두 번째 객체를 x2, y2 매개변수 분해
){
return {x:x1 + x2, y:y1 + y2};
}
vectorAdd({x:1, y:2}, {x:3, y:4}) // => {x:4, x:6}
// name=value 형태의 매개변수 전달(2)
// {x,y} 또는 {x,y,z} 벡터에 스칼라 값을 곱한다.
function vectorMultiply({x,y,z=0}, scalar) {
return {x:x*scalar, y:y*scalar, z:z*scalar };
}
vectorMultiply({x:1,y:2}, 2)
// name=value 형태의 매개변수 전달(3)
function arrayCopy({from, to=from, n=from.length, fromIndex=0, toIndex=0}){
let valueToCopy = from.slice(fromIndex, formIndex + n);
to.splice(toIndex, 0, ...valueToCopy);
return to;
}
let a = [1,2,3,4,5], b=[9,8,7,6,5];
arrayCopy({from: a, n: 3, to: b, toIndex:4}) // => [9,8,7,6,1,2,3,5]
// 배열 분해
// 배열의 첫 번째와 두 번째 요소는 x,y 매개변수에 할당
// 남는 요소는 모두 cords 배열에 저장
// 첫 번째 배열을 제외한 인자는 모두 rest 배열에 저장
function f([x, y, ...coords], ...rest) {
return [x+y, ...rest. ...coords]; // 분해 연산자 사용
}
f([1,2,3,4], 5, 6) // => [3,5,6,3,4]
// {x,y} 또는 {x,y,z} 벡터에 스칼라 값을 곱하고 다른 프로퍼티 유지
function vectorMultiply({x, y, z=0, ...props}, scalar){
return {x: x*scalar, y: y*scalar, z: z*scalar, ...props };
}
vectorMultiply({x:1, y:2, w:-1}, 2) // => {x:2, y:4, z:0, w:-1}
- 인자 타입
: 자바스크립트는 매개변수에서 타입을 체크하지 않으므로 특히 숫자를 인자로
보내게 될때에는 에러가 발생할 수 있다. 그러므로 별도 타입 체크가 필요함
반응형