No ES6 / ES2015 , os parâmetros padrão estão na especificação do idioma.
function read_file(file, delete_after = false) {
// Code
}
simplesmente funciona.
Referência: Parâmetros Padrão - MDN
Os parâmetros de função padrão permitem que parâmetros formais sejam inicializados com valores padrão se nenhum valor ou indefinido for passado.
Você também pode simular parâmetros nomeados padrão através da desestruturação :
// the `= {}` below lets you call the function without any parameters
function myFor({ start = 5, end = 1, step = -1 } = {}) { // (A)
// Use the variables `start`, `end` and `step` here
···
}
Antes do ES2015 ,
Existem várias maneiras, mas esse é o meu método preferido - ele permite que você passe o que quiser, incluindo falso ou nulo. ( typeof null == "object"
)
function foo(a, b) {
a = typeof a !== 'undefined' ? a : 42;
b = typeof b !== 'undefined' ? b : 'default_b';
...
}
function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; }
e então você pode chamá-lo comoa = defaultFor(a, 42);
undefined
objetos: p Mesmo que funcione com alguns navegadores e possa ser mais rápido,null
ainda é um objeto eundefined
é referência ao tipo primitivo que está tentando dizer que há nada aqui, nem mesmonull
. Veja aqui os dois casos em poucas palavras: JavaScript / Reference / Global_Objects / undefined .typeof
será redundante.function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; }
Isso não gera erros de referência e é conciso.a = a
eb = b
quando esses parâmetros não são indefinidos. Além disso, esse operador ternário com uma condição um pouco complicada pode ser difícil de ler para futuros mantenedores. Eu preferiria a seguinte sintaxe:if (typeof a == 'undefined') a = 42
- nenhuma atribuição desnecessária e um pouco mais fácil de ler.typeof
? Parece mais simples de fazera === undefined
. Além disso, dessa forma, você obteria um erro de referência se escrevesse incorretamenteundefined
x colocá-lo em uma string.Isso atribui ao
delete_after
valor dedelete_after
se não for um valor falsey, caso contrário, atribui a string"my default here"
. Para mais detalhes, consulte a pesquisa de Doug Crockford sobre o idioma e a seção Operadores .Essa abordagem não funciona se você deseja passar em um falsey valor ou seja
false
,null
,undefined
,0
ou""
. Se você precisar que os valores de falsey sejam passados, precisará usar o método na resposta de Tom Ritter .Ao lidar com vários parâmetros para uma função, geralmente é útil permitir ao consumidor passar os argumentos dos parâmetros em um objeto e depois mesclar esses valores com um objeto que contém os valores padrão da função
usar
fonte
delete_after
não obtém o resultado booleano da expressãodelete_after || "my default value"
?Acho que algo simples como esse é muito mais conciso e legível pessoalmente.
fonte
_.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});
. O uso do namespace global, como mostrado nesta resposta, é considerado por muitos uma prática ruim. Você também pode considerarutil.default(arg, "defaul value")
usar seu próprio utilitário para esta tarefa comum (por exemplo ) se não quiser usar sublinhado, mas eu acabo usando sublinhado mais cedo ou mais tarde, de qualquer maneira, não adianta reinventar a roda.undefined
com algum outro valor, causando falha no teste.undefined
. Portanto, ainda é uma boa ideia usartypeof
e'undefined'
.No ECMAScript 6, você poderá escrever exatamente o que possui:
Isso será definido
delete_after
comofalse
se não estiver presente ouundefined
. Você pode usar recursos ES6 como este hoje com transpilers como Babel .Consulte o artigo MDN para obter mais informações .
fonte
Valores de parâmetro padrão
Com o ES6, você pode fazer um dos idiomas mais comuns em
JavaScript
relação à configuração de um valor padrão para um parâmetro de função. A maneira como fizemos isso por anos deve parecer bastante familiar:Esse padrão é mais usado, mas é perigoso quando passamos valores como
Por quê? Porque o
0 is falsy
, e então ox || 11 results in 11
, não o diretamente passado em 0. Para corrigir esse problema, algumas pessoas escrevem o cheque de maneira mais detalhada assim:agora podemos examinar uma boa sintaxe útil adicionada a partir de
ES6
para simplificar a atribuição de valores padrão a argumentos ausentes:x = 11
em uma declaração de função é mais comox !== undefined ? x : 11
o idioma muito mais comumx || 11
Expressões de valor padrão
Function
valores padrão podem ser mais do que valores simples como 31; eles podem ser qualquer expressão válida, até umfunction call
:Como você pode ver, as expressões de valor padrão são avaliadas com preguiça, o que significa que só são executadas se e quando são necessárias - ou seja, quando o argumento de um parâmetro é omitido ou indefinido.
Uma expressão de valor padrão pode até ser uma chamada de expressão de função embutida - geralmente chamada de Expressão de Função Invocada Imediatamente
(IIFE)
:fonte
essa solução é trabalho para mim em js:
fonte
delete_after
é0
ounull
? Não funcionará corretamente para esses casos.delete_after = delete_after === undefined ? false : delete_after
?Basta usar uma comparação explícita com indefinido.
fonte
Eu recomendaria muito cuidado ao usar valores de parâmetro padrão em javascript. É muitas vezes cria erros quando usado em conjunto com as funções de ordem superior, como
forEach
,map
, ereduce
. Por exemplo, considere esta linha de código:parseInt possui um segundo parâmetro opcional
function parseInt(s, [
radix,=10])
mas mapeia as chamadasparseInt
com três argumentos: ( elemento , índice e matriz ).Sugiro que você separe os parâmetros necessários dos argumentos com valor opcional / padrão. Se sua função usa 1,2 ou 3 parâmetros necessários para os quais nenhum valor padrão faz sentido, torne-os parâmetros posicionais para a função, quaisquer parâmetros opcionais devem seguir como atributos nomeados de um único objeto. Se sua função precisar de 4 ou mais, talvez faça mais sentido fornecer todos os argumentos por meio de atributos de um único parâmetro de objeto.
No seu caso, sugiro que você escreva sua função deleteFile assim: ( editada
instead
pelos comentários ) ...A execução do trecho acima ilustra os perigos ocultos por trás dos valores de argumento padrão para parâmetros não utilizados.
fonte
typeof deleteAfter === 'bool'
e lançar Exception caso contrário. Além disso, no caso de usar métodos como map / foreach etc., use-os com cuidado e agrupe as funções chamadas com função anônima.['1', '2', '3'].map((value) => {read_file(value);})
get
método do lodash para recuperar deleteAfter. Lançar uma exceçãotypeof 'deleteAfter' !== 'bool'
também pode ser uma boa medida prudente. Não gosto de criar métodos que exijam que o chamador "tenha cuidado". Cuidado é responsabilidade da função, não do chamador. O comportamento final deve seguir o princípio da menor surpresa.Como uma atualização ... com o ECMAScript 6, você pode FINALMENTE definir valores padrão nas declarações de parâmetros de função da seguinte forma:
Conforme referenciado por - http://es6-features.org/#DefaultParameterValues
fonte
como desenvolvedor C ++ há muito tempo (iniciante no desenvolvimento da Web :)), quando me deparei com essa situação, fiz a atribuição de parâmetros na definição de função, como mencionado na pergunta, como segue.
Mas lembre-se de que ele não funciona de maneira consistente nos navegadores. Para mim, funcionou no chrome no meu desktop, mas não funcionou no chrome no android. A opção mais segura, como muitos mencionaram acima, é -
A intenção desta resposta não é repetir as mesmas soluções, o que outros já mencionaram, mas informar que a atribuição de parâmetros na definição de função pode funcionar em alguns navegadores, mas não depende dela.
fonte
function myfunc(a,b=10)
é a sintaxe do ES6, há links para tabelas de compatibilidade em outras respostas.Para qualquer pessoa interessada em que o código funcione no Microsoft Edge, não use padrões nos parâmetros de função.
Nesse exemplo, o Edge lançará um erro "Esperando ')'"
Para contornar esse uso
Em 08 de agosto de 2016, este ainda é um problema
fonte
Conforme a sintaxe
você pode definir o valor padrão dos parâmetros formais. e também verifique o valor indefinido usando a função typeof .
fonte
fonte
Use isso se desejar usar a
ECMA6
sintaxe mais recente :É chamado
default function parameters
. Permite que parâmetros formais sejam inicializados com valores padrão se nenhum valor ou indefinido for passado. NOTA : Ele não funciona com o Internet Explorer ou navegadores mais antigos.Para máxima compatibilidade possível, use o seguinte:
Ambas as funções têm exatamente o mesmo comportamento de cada um desses exemplos, com base no fato de que a variável de parâmetro será
undefined
se nenhum valor de parâmetro foi passado ao chamar essa função.fonte
ES6: Como já mencionado na maioria das respostas, no ES6, você pode simplesmente inicializar um parâmetro junto com um valor.
ES5: A maioria das respostas dadas não são bons o suficiente para mim, porque há ocasiões em que eu possa ter de passar valores Falsey tais como
0
,null
eundefined
para uma função. Para determinar se um parâmetro é indefinido porque esse é o valor que eu passei em vez de indefinido por não ter sido definido de maneira alguma, faço isso:fonte
Aqui foo () é uma função que possui um parâmetro chamado argValue. Se não passarmos nada na chamada de função aqui, a função throwIfNoValue () será chamada e o resultado retornado será atribuído ao único argumento argValue. É assim que uma chamada de função pode ser usada como parâmetro padrão. O que torna o código mais simplificado e legível.
Este exemplo foi retirado daqui
fonte
Se você estiver usando,
ES6+
poderá definir parâmetros padrão da seguinte maneira:Se você precisar de
ES5
sintaxe, poderá fazê-lo da seguinte maneira:Na sintaxe acima, o
OR
operador é usado. OOR
operador sempre retorna o primeiro valor, se puder ser convertido em,true
caso contrário, ele retornará o valor do lado direito. Quando a função é chamada sem argumento correspondente, a variável de parâmetro (bar
em nosso exemplo) é configuradaundefined
pelo mecanismo JS.undefined
É então convertido para false e, assim, oOR
operador retorna o valor 0.fonte
Sim, o uso de parâmetros padrão é totalmente suportado no ES6 :
ou
mas antes no ES5, você poderia fazer isso facilmente:
O que significa que, se o valor estiver lá, use o valor, caso contrário, use o segundo valor após
||
operação, que faz a mesma coisa ...Nota: também há uma grande diferença entre aqueles que se você passar um valor para o ES6, mesmo que o valor seja falso, que será substituído por um novo valor, algo como
null
ou""
... mas o ES5 apenas será substituído se apenas o valor passado é verdade, é porque a maneira de||
trabalhar ...fonte
Se, por algum motivo, você não estiver no ES6 e estiver usando
lodash
aqui, é uma maneira concisa de padronizar os parâmetros de função por meio do_.defaultTo
método:O que definirá o padrão se o valor atual for NaN , nulo ou indefinido
fonte
Sons do futuro
No futuro, você poderá "espalhar" um objeto para outro (atualmente a partir de 2019 NÃO é suportado pelo Edge !) - demonstração de como usá-lo para boas opções padrão, independentemente da ordem:
Referência MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
... enquanto isso, o Edge DOES suporta Object.assign () (o IE não, mas realmente espero que possamos deixar o IE para trás :))
Da mesma forma, você poderia fazer
EDIT: Devido aos comentários sobre as
const
opções - o problema de usar opções constantes no restante da função não é que você não possa fazer isso, é apenas que não pode usar a variável constante em sua própria declaração - você teria para ajustar a nomeação de entrada para algo comofonte
function(opt){ const opt = /*some merging*/; }
? Isso com certeza não vai funcionar porque você usariaconst
variável antes de ter sido declarada - você teria que ajustar -function test(input_opt){ const opt = { someKey: 'someDefaultValue', ...input_opt} }
Apenas para mostrar minhas habilidades também (lol), a função acima pode ser escrita mesmo sem ter nomeado argumentos como abaixo:
ES5 e acima
ES6 e acima
fonte
O código a seguir pode funcionar nessa situação, incluindo o ECMAScript 6 (ES6), bem como as versões anteriores.
como o valor padrão em idiomas funciona quando o valor do parâmetro da função é ignorado ao chamar, no JavaScript ele é atribuído como indefinido . Essa abordagem não parece atraente programaticamente, mas tem compatibilidade com versões anteriores .
fonte
Sim, isso é chamado de parâmetro padrão
Os parâmetros de função padrão permitem que parâmetros formais sejam inicializados com valores padrão se nenhum valor ou indefinido for passado.
Sintaxe:
Descrição:
Parâmetros de funções padrão para indefinidos No entanto, em situações, pode ser útil definir um valor padrão diferente. É aqui que os parâmetros padrão podem ajudar.
No passado, a estratégia geral para definir padrões era testar valores de parâmetros no corpo da função e atribuir um valor se eles não estiverem definidos. Se nenhum valor for fornecido na chamada, seu valor será indefinido. Você precisaria definir uma verificação condicional para garantir que o parâmetro não seja indefinido
Com os parâmetros padrão no ES2015, a verificação no corpo da função não é mais necessária. Agora você pode simplesmente colocar um valor padrão na cabeça da função.
Exemplo das diferenças:
Exemplos de sintaxe diferentes:
Preenchimento indefinido vs outros valores falsos:
Mesmo se o valor for definido explicitamente ao chamar, o valor do argumento num será o padrão.
Avaliada no momento da chamada:
O argumento padrão é avaliado no momento da chamada, portanto, diferente de outros idiomas, um novo objeto é criado toda vez que a função é chamada.
Os parâmetros padrão estão disponíveis para os parâmetros padrão posteriores:
Os parâmetros já encontrados estão disponíveis para parâmetros padrão posteriores
Funções definidas dentro do corpo da função:
Introduzido no Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). As funções declaradas no corpo da função não podem ser consultadas dentro dos parâmetros padrão e geram um ReferenceError (atualmente um TypeError no SpiderMonkey, consulte o bug 1022967). Os parâmetros padrão são sempre executados primeiro, as declarações de funções dentro do corpo da função são avaliadas posteriormente.
Parâmetros sem padrões após os parâmetros padrão:
Antes do Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2), o código a seguir resultava em um SyntaxError. Isso foi corrigido no bug 777060 e funciona como esperado em versões posteriores. Os parâmetros ainda são definidos da esquerda para a direita, substituindo os parâmetros padrão, mesmo se houver parâmetros posteriores sem padrões.
Parâmetro destruído com atribuição de valor padrão:
Você pode usar a atribuição de valor padrão com a notação de atribuição de desestruturação
fonte
Uma abordagem diferente para definir parâmetros padrão é usar o mapa de objetos de argumentos, em vez de argumentos diretamente. Por exemplo,
Dessa forma, é fácil estender os argumentos e não se preocupar com a incompatibilidade de comprimento dos argumentos.
fonte
A resposta é sim. De fato, existem muitos idiomas que suportam parâmetros padrão. Python é um deles:
Embora esse seja o código Python 3 devido aos parênteses, os parâmetros padrão nas funções também funcionam em JS.
Por exemplo, e no seu caso:
Mas às vezes você realmente não precisa de parâmetros padrão.
Você pode apenas definir a variável logo após o início da função, assim:
Nos dois exemplos, ele retorna a mesma coisa. Mas, às vezes, eles realmente podem ser úteis, como em projetos muito avançados.
Portanto, em conclusão, os valores padrão dos parâmetros podem ser usados em JS. Mas é quase o mesmo que definir uma variável logo após o início da função. No entanto, às vezes eles ainda são muito úteis. Como você deve ter notado, os valores padrão dos parâmetros têm 1 linha a menos de código do que a maneira padrão que define o parâmetro logo após o início da função.
EDIT: E isso é super importante! Isso não funcionará no IE. Veja a documentação . Portanto, com o IE, você deve usar o método "definir variável no topo da função". Parâmetros padrão não funcionarão no IE.
fonte
Sim, isso funcionará em Javascript. Você também pode fazer isso:
fonte