Obter aridade de uma função
-
27-10-2019 - |
Pergunta
Em Javascript, como se pode determinar o número de parâmetros formais definidos para uma função?
Observe que este não é o parâmetro arguments
quando a função é chamada, mas o número de argumentos nomeados com os quais a função foi definida.
function zero() {
// Should return 0
}
function one(x) {
// Should return 1
}
function two(x, y) {
// Should return 2
}
Solução
> zero.length
0
> one.length
1
> two.length
2
Uma função pode determinar sua própria aridade (comprimento) como este:
// For IE, and ES5 strict mode (named function)
function foo(x, y, z) {
return foo.length; // Will return 3
}
// Otherwise
function bar(x, y) {
return arguments.callee.length; // Will return 2
}
Outras dicas
O arity de uma função é armazenado em sua propriedade .length
.
function zero() {
return arguments.callee.length;
}
function one(x) {
return arguments.callee.length;
}
function two(x, y) {
return arguments.callee.length;
}
> console.log("zero="+zero() + " one="+one() + " two="+two())
zero=0 one=1 two=2
Conforme explicado em outras respostas, a propriedade length
informa isso. Portanto, zero.length
será 0, one.length
será 1 e two.length
será 2.
No ES2015, temos duas rugas:
- As funções podem ter um parâmetro "rest" no final da lista de parâmetros que reúne quaisquer argumentos fornecidos naquela posição ou posteriormente em uma matriz verdadeira (ao contrário da pseudo-matriz
arguments
) - Os parâmetros da função podem ter valores padrão
O parâmetro "resto" não é contado ao determinar a aridade da função:
function stillOne(a, ...rest) { }
console.log(stillOne.length); // 1
Da mesma forma, um parâmetro com um argumento padrão não adiciona ao arity e, de fato, evita que qualquer outro que o siga de adicionar a ele, mesmo se eles não tiverem padrões explícitos (eles assumem que têm um padrão silencioso de undefined
):
function oneAgain(a, b = 42) { }
console.log(oneAgain.length); // 1
function oneYetAgain(a, b = 42, c) { }
console.log(oneYetAgain.length); // 1
Uma função aridade é o número de parâmetros que a função contém. Ela pode ser obtida chamando a propriedade length.
<"Exemplo:
function add(num1,num2){}
console.log(add.length); // --> 2
function add(num1,num2,num3){}
console.log(add.length); // --> 3
Observação: o número de parâmetros passados em uma chamada de função não afeta a aridade da função.
A propriedade arity usada para retornar o número de argumentos esperados pela função, no entanto, ela não existe mais e foi substituída pela propriedade Function.prototype.length.