Parâmetro sem presente? Entendendo os valores padrão em JavaScript
\n\nImagine que você pediu uma pizza. Você liga para a entrega e diz: "Para mim, uma pizza, por favor." O atendente pergunta: "Qual?" — "Bem, a padrão, com queijo e calabresa." Você nem pensa que a pizza tem parâmetros padrão.
\n\nDa mesma forma em JavaScript: funções são frequentemente chamadas sem todos os argumentos. E se o programador não previu set a default parameter value for a JavaScript function, o código pode quebrar ou se comportar de forma imprevisível. Neste artigo, vamos abordar todas as formas de definir um valor padrão para um parâmetro de função em JS — desde os velhos e bons "gambiarras" até a sintaxe moderna do ES6. Vamos nessa!
\n\nPor que isso é importante?
\n\nSuponha que temos uma função que saúda o usuário:
\n\nfunction greet(name) {\n console.log('Olá, ' + name + '!');\n}\n\ngreet(); // Exibe: "Olá, undefined!" — estranho, né?\n\nSem default parameters javascript, um argumento não passado se torna undefined. E se tentarmos chamar um método em undefined — teremos um erro. Portanto, parâmetros padrão js não são apenas conveniência, mas sim proteção contra bugs.
Método 1: Clássico — operador ternário (ou if)
\n\nAntes do ES6, os desenvolvedores usavam o operador ternário javascript ou uma simples verificação. Funciona, mas parece verboso:
\n\nfunction multiply(a, b) {\n a = a !== undefined ? a : 1;\n b = b !== undefined ? b : 2;\n return a * b;\n}\n\nconsole.log(multiply(5)); // 10 (5 * 2)\nconsole.log(multiply()); // 2 (1 * 2)\n\nPrós: Claro até para iniciantes, compatível com navegadores antigos.
\nContras: O código fica inchado. Se houver 5–6 parâmetros, a legibilidade cai drasticamente.
Armadilha: verificação de undefined vs truthy
\n\nMuitos iniciantes escrevem assim:
\n\nfunction greet(name) {\n name = name || 'Convidado';\n console.log('Olá, ' + name);\n}\n\nIsso funciona, até que você passe 0, uma string vazia '' ou false. Todos esses valores são falsy, e a função os substituirá por 'Convidado'. Se você precisar passar 0 como um valor válido — essa abordagem quebrará. Use a verificação estrita de undefined.
Método 2: O objeto mágico arguments
\n\nDentro de cada função (exceto arrow functions) existe um objeto implícito semelhante a um array chamado arguments javascript. Ele pode ser usado para verificar os argumentos passados:
\n\nfunction showInfo(name, age) {\n name = arguments.length > 0 ? name : 'Anônimo';\n age = arguments.length > 1 ? age : 'não informado';\n return `${name}, idade: ${age}`;\n}\n\nconsole.log(showInfo()); // Anônimo, idade: não informado\n\nPrós: Dá controle total sobre quais argumentos foram passados.
\nContras: Sintaxe obsoleta, não funciona em arrow functions. Geralmente usado apenas para tarefas muito específicas (por exemplo, quando o número de parâmetros é desconhecido antecipadamente).
Método 3: Padrão moderno — parâmetros padrão ES6
\n\nA partir do ECMAScript 2015, definir parâmetros padrão js pode ser feito diretamente na declaração da função. Esta é a maneira mais limpa e recomendada:
\n\nfunction multiply(a = 1, b = 2) {\n return a * b;\n}\n\nconsole.log(multiply(5)); // 10\nconsole.log(multiply()); // 2\n\nBonito, né? Mas existem nuances importantes que você precisa saber para não cair em armadilhas.
\n\nNuance 1: Valores padrão são calculados no momento da chamada
\n\nIsso significa que se você passar undefined — o padrão será acionado. Se você passar null — não:
function test(x = 10) {