함수 정의식에 작성된 인자 개수보다 인수를 적게 전달해서 함수를 실행하면 인수에서 생략한 인자는 undefind가 된다. 이러한 성질을 활용하면 호출할 때 인수를 생략할 수 있는 함수를 정의할 수 있다. 이를 구현하려면 함수 정의식에서 인수를 생략 했을때 사용할 초깃값을 설정 해줘야 한다.

function f(x,y) {
	console.log(X, Y)
}
f(2) // x = 2, y = undefined

function f(x,y) {
	y = y || 1;
	console.log(X, Y)
}
f(2) // x = 2, y = 1

논리연산자인 ||는 왼쪽 피연산자가 true로 평가되면 왼쪽 피연산자를 반환한다. 반대로 false로 평가되면 오른쪽 피연산자를 반환한다.

가변 길이 인수 목록


모든 함수에서 사용할 수 있는 지역변수로는 arguments 변수가 있다. 이 변수 값은 Arguments 객체이다. 이 객체는 프로퍼티로 length와 callee을 갖고 있으며 각 프로퍼티에는 다음과 같은 값이 담겨져 있다.

이 객체는 유사 배열 객체이다. 만약 arguments[i]의 값을 바꾸면 함수의 인자의 값이 바뀌게 된다. 일반적이 배열에는 이러한 성질이 없다. 이 변수를 활용하면 인수 개수가 일정하지 않은 가변 인수 함수를 정의할 수 있다.

function myF(string) {
	let s = "";
	for(let i = 1; i < arguments.length; i++){
		s += arguments[i]
	}
}

이 객체는 유사 배열 객체이나, 다음 아래의 방법을 사용한다면 배열 객체로 변환 할 수 있다.

let params = [].slice.call(arguments);

arguments.callee을 이용하면 이름 없는 이멱 함수 또한 재귀 호출 할 수 있다. 왜냐하면 callee가 지금 실행 중인 함수를 가리키기 때문이다.