함수를 작성하는 사람은 해당 함수의 필요한 인자 개수를 알 수 있다. 또한 해당 함수를 사용하려는 사람도 해당 함수의 정의 코드를 확인하면 인자 개수를 확인 할 수 있을 것이다. 하지만 내장 함수의 경우는 어떠한가?
뭐 물론 아래 처럼 어떤 인자를 받을 수 있는지 확인이 가능할 것이다.
표준
<https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-math.max>
자 그러면 표준을 살펴 보자. 표준이 위와 같다. 잘 안보일 것 같으니 내용을 다시 작성해 본다면
Math.max( ...args ) 이 내용만 보면 ...values가 맞는 말이다. 하지만 제일 아래 줄을 보도록 하자.
이 함수의 "length"속성의 값은 2입니다.
자 간단하게 Math.max( ...args )를 만들어 보고 length가 2인지 확인 해보도록 하자.
function max( ...args ) {
// 1. Let coerced be a new empty List.
const list = []
/*
2. For each element arg of args, do
a. Let n be ? ToNumber(arg).
b. Append n to coerced.
*/
for( const arg of args ) {
const n = +arg
list.push(n)
}
// 3. Let highest be -∞𝔽.
let highest = -Infinity
/*
4. For each element number of coerced, do
a. If number is NaN, return NaN.
b. If number is +0𝔽 and highest is -0𝔽, set highest to +0𝔽.
c. If number > highest, set highest to number.
*/
for( const number of list ) {
if( Number.isNaN( number ) ) {
return NaN
}
if ( number === Infinity && highest === -Infinity ) {
highest = Infinity
}
if ( number > highest ) {
highest = number
}
}
// 5. Return highest.
return highest
}
자 위가 표준대로 구현된 max함수이다. 구현하면서 신기한 것을 발견 햇는데... NaN이 Infinity보다 큰 것으로 판단 하는 점과, 뭐 물론 위에서는 ToNumber함수는 너무 복잡하여 구현 하지 않았지만, "123.sadf"와 같은 문자열은 NaN으로 처리 되는 점이 신기했다.
"length"
자 그러면 우리가 만든 함수의 길이는 어떨까?
길이를 맞춰주려면 어떻게 할까? 간단하게 max.length = 2 이렇게 하면 될까?
일단 간단하게 말하면 표준을 지키면서 만드는 것은 불가능 하다. 그건 아래의 내용으로 설명을 대체 하겠다.
함수의 length
함수의 length의 정의는 아래와 같다.
적당히 설명 하자면 함수에서의 length는 허가된 인자의 개수이다. 허가된 인자의 초과 개수 부터는 해당 함수의 실행을 따른다고 작성 되어있다.
우리가 만든 max함수는 허가된 인자는 몇개 일까? ...args로 작성했으니, 0개 이상이라고 보면 될 것 같다. 그러면 허가된 인자는 0개라고 표현 할 수 있을 것이고,
우리가 만든 max함수는 허가된 인자는 몇개 일까? ...args로 작성했으니, 0개 이상이라고 보면 될 것 같다. 그러면 허가된 인자는 0개라고 표현 할 수 있을 것이고,
<https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/max>
위는 Math.max의 mdn 설명이다 정확히 0개 이상의 숫자 중... 이라고 되어있는 것을 볼 수 있을 것이다.함수의 length 늘리기
그렇다면 max.length를 2로 만들어 보자. 허가된 인자를 만들기 위해서는 ...args외의 두 개의 매개 변수가 필요 하다.
하지만 위의 방법으로는 표준의 설명대로 함수를 구현 할 수도 없음과 매개변수의 모양도 바뀌게 된다. length가 읽기 전용 속성이라서 발생하는 문제이다.
더불어
추가적인 내용이다 함수의 길이는 매개 변수의 기본 값을 설정하면 그 전의 개수까지만 새게 된다. n3의 기본 값을 3으로 만들기 위해서는 최대 두 번째 인자까지 넣어야 하기 때문에 허가된 인자를 2개 이상으로 판단하기 때문인 것으로 추측 된다.
댓글
댓글 쓰기