Depuis ES6 / ES2015 , les paramètres par défaut sont dans la spécification de langue.
function read_file(file, delete_after = false) {
// Code
}
fonctionne juste.
Référence: Paramètres par défaut - MDN
Les paramètres de fonction par défaut permettent aux paramètres formels d'être initialisés avec des valeurs par défaut si aucune valeur ou indéfinie n'est transmise.
Vous pouvez également simuler des paramètres nommés par défaut via la déstructuration :
// 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
···
}
Pré ES2015 ,
Il existe de nombreuses façons, mais c'est ma méthode préférée - elle vous permet de transmettre tout ce que vous voulez, y compris faux ou nul. ( 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; }
puis vous pouvez l'appeler commea = defaultFor(a, 42);
undefined
objets: p Même s'il peut fonctionner avec certains navigateurs et être plus rapide, ilnull
s'agit toujours d'un objet etundefined
fait référence au type primitif qui essaie de dire qu'il existe rien ici, même pasnull
. Voir ici, les deux cas en bref: JavaScript / Reference / Global_Objects / undefined .typeof
est redondant.function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; }
Cela ne générera pas d'erreurs de référence et est concis.a = a
etb = b
quand ces paramètres ne sont pas indéfinis. En outre, cet opérateur ternaire avec une condition un peu compliquée peut être difficile à lire pour les futurs responsables. Je préférerais la syntaxe suivante:if (typeof a == 'undefined') a = 42
- pas d'affectation inutile et un peu plus facile à lire.typeof
? Il semblerait plus simple de le fairea === undefined
. De plus, vous obtiendrez une erreur de référence si vous avez mal orthographié parundefined
rapport à le mettre dans une chaîne.Ceci affecte à
delete_after
la valeur dedelete_after
si ce n'est pas une valeur de falsey sinon il affecte la chaîne"my default here"
. Pour plus de détails, consultez le sondage de Doug Crockford sur la langue et consultez la section sur les opérateurs .Cette approche ne fonctionne pas si vous voulez passer dans une Falsey valeur -à- dire
false
,null
,undefined
,0
ou""
. Si vous souhaitez que les valeurs de falsey soient transmises, vous devrez utiliser la méthode indiquée dans la réponse de Tom Ritter .Lorsqu'il s'agit d'un certain nombre de paramètres d'une fonction, il est souvent utile de permettre au consommateur de passer les arguments de paramètre dans un objet, puis de fusionner ces valeurs avec un objet qui contient les valeurs par défaut de la fonction
utiliser
la source
delete_after
le résultat booléen ne soit pas obtenudelete_after || "my default value"
?Je trouve que quelque chose de simple comme ça est beaucoup plus concis et lisible personnellement.
la source
_.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});
. L'utilisation de l'espace de noms global comme indiqué dans cette réponse est considérée par beaucoup comme une mauvaise pratique. Vous pouvez également envisager de lancer votre propre utilitaire pour cette tâche courante (par exemple.util.default(arg, "defaul value")
) Si vous ne souhaitez pas utiliser de soulignement, mais je finis surtout par utiliser le soulignement tôt ou tard de toute façon, il est inutile de réinventer la roue.undefined
avec une autre valeur, provoquant l'échec du test.undefined
. Donc, c'est toujours une bonne idée d'utilisertypeof
et'undefined'
.Dans ECMAScript 6, vous pourrez réellement écrire exactement ce que vous avez:
Il sera réglé
delete_after
surfalse
s'il n'est pas présent ouundefined
. Vous pouvez utiliser des fonctionnalités ES6 comme celle-ci aujourd'hui avec des transpilers tels que Babel .Consultez l'article MDN pour plus d'informations .
la source
Valeurs des paramètres par défaut
Avec ES6, vous pouvez peut-être l'un des idiomes les plus courants en ce qui
JavaScript
concerne la définition d'une valeur par défaut pour un paramètre de fonction. La façon dont nous procédons depuis des années devrait sembler assez familière:Ce modèle est le plus utilisé, mais il est dangereux lorsque nous transmettons des valeurs comme
Pourquoi? Parce que le
0 is falsy
, et donc lex || 11 results in 11
, pas le directement passé en 0. Pour résoudre ce problème, certaines personnes écriront plutôt la vérification plus verbalement comme ceci:nous pouvons maintenant examiner une belle syntaxe utile ajoutée à partir de
ES6
pour rationaliser l'attribution des valeurs par défaut aux arguments manquants:x = 11
dans une déclaration de fonction ressemble plusx !== undefined ? x : 11
à l'idiome beaucoup plus courantx || 11
Expressions de valeur par défaut
Function
les valeurs par défaut peuvent être plus que de simples valeurs comme 31; ils peuvent être n'importe quelle expression valide, même unfunction call
:Comme vous pouvez le voir, les expressions de valeur par défaut sont évaluées paresseusement, ce qui signifie qu'elles ne sont exécutées que si et quand elles sont nécessaires, c'est-à-dire lorsque l'argument d'un paramètre est omis ou n'est pas défini.
Une expression de valeur par défaut peut même être un appel d'expression de fonction en ligne - communément appelé expression de fonction immédiatement appelée
(IIFE)
:la source
cette solution fonctionne pour moi dans js:
la source
delete_after
est0
ounull
? Cela ne fonctionnera pas correctement pour ces cas.delete_after = delete_after === undefined ? false : delete_after
?Utilisez simplement une comparaison explicite avec undefined.
la source
Je recommanderais fortement une extrême prudence lors de l'utilisation des valeurs de paramètres par défaut en javascript. Il crée souvent des bugs lorsqu'ils sont utilisés conjointement avec des fonctions d'ordre supérieur comme
forEach
,map
etreduce
. Par exemple, considérez cette ligne de code:parseInt a un second paramètre optionnel
function parseInt(s, [
radix=10])
mais mappe les appelsparseInt
avec trois arguments: ( élément , index et tableau ).Je vous suggère de séparer vos paramètres requis de vos arguments optionnels / par défaut. Si votre fonction prend 1,2 ou 3 paramètres requis pour lesquels aucune valeur par défaut n'a de sens, définissez-les comme des paramètres positionnels pour la fonction, tous les paramètres facultatifs doivent suivre en tant qu'attributs nommés d'un seul objet. Si votre fonction prend 4 ou plus, il est peut-être plus logique de fournir tous les arguments via les attributs d'un paramètre d'objet unique.
Dans votre cas, je vous suggère d'écrire votre fonction deleteFile comme ceci: ( édité selon
instead
les commentaires de ) ...L'exécution de l'extrait ci-dessus illustre les dangers qui se cachent derrière les valeurs d'argument par défaut pour les paramètres inutilisés.
la source
typeof deleteAfter === 'bool'
et de lever l'exception sinon. De plus, en cas d'utilisation de méthodes telles que map / foreach, etc., utilisez-les avec prudence et enveloppez les fonctions appelées avec une fonction anonyme.['1', '2', '3'].map((value) => {read_file(value);})
get
méthode de lodash pour récupérer deleteAfter. Lancer une exceptiontypeof 'deleteAfter' !== 'bool'
peut également être une bonne mesure prudente. Je n'aime pas concevoir des méthodes qui obligent l'appelant à "faire preuve de prudence". La prudence incombe à la fonction et non à l'appelant. Le comportement final doit suivre le principe de la moindre surprise.Comme mise à jour ... avec ECMAScript 6, vous pouvez ENFIN définir les valeurs par défaut dans les déclarations de paramètres de fonction comme ceci:
Comme référencé par - http://es6-features.org/#DefaultParameterValues
la source
étant un développeur C ++ de longue date (débutant en développement Web :)), lorsque j'ai rencontré cette situation pour la première fois, j'ai fait le paramétrage dans la définition de la fonction, comme cela est mentionné dans la question, comme suit.
Mais attention, cela ne fonctionne pas de manière cohérente sur tous les navigateurs. Pour moi, cela fonctionnait sur Chrome sur mon bureau, mais ne fonctionnait pas sur Chrome sur Android. Une option plus sûre, comme beaucoup l'ont mentionné ci-dessus est -
L'intention de cette réponse n'est pas de répéter les mêmes solutions, ce que d'autres ont déjà mentionné, mais d'informer que l'attribution des paramètres dans la définition de fonction peut fonctionner sur certains navigateurs, mais ne vous y fiez pas.
la source
function myfunc(a,b=10)
poserait la question de la syntaxe ES6, il existe des liens vers des tableaux de compatibilité dans d'autres réponses.Pour toute personne intéressée à faire travailler le code dans Microsoft Edge, n'utilisez pas les valeurs par défaut dans les paramètres de fonction.
Dans cet exemple, Edge générera une erreur "Expecting ')'"
Pour contourner cette utilisation
Depuis le 08 août 2016, ce problème persiste
la source
Selon la syntaxe
vous pouvez définir la valeur par défaut des paramètres formels. et également vérifier la valeur indéfinie en utilisant la fonction typeof .
la source
la source
Utilisez ceci si vous souhaitez utiliser la dernière
ECMA6
syntaxe:Il est appelé
default function parameters
. Il permet aux paramètres formels d'être initialisés avec des valeurs par défaut si aucune valeur ou non définie n'est transmise. REMARQUE : il ne fonctionnera pas avec Internet Explorer ou les navigateurs plus anciens.Pour une compatibilité maximale possible, utilisez ceci:
Les deux fonctions ont exactement le même comportement que chacun de ces exemples reposent sur le fait que la variable de paramètre sera
undefined
si aucune valeur de paramètre n'a été passée lors de l'appel de cette fonction.la source
ES6: Comme déjà mentionné dans la plupart des réponses, dans ES6, vous pouvez simplement initialiser un paramètre avec une valeur.
ES5: La plupart des réponses données ne sont pas assez bon pour moi parce qu'il ya des occasions où je peux avoir à transmettre des valeurs de Falsey telles que
0
,null
etundefined
à une fonction. Pour déterminer si un paramètre n'est pas défini car c'est la valeur que j'ai transmise au lieu de non défini car il n'a pas été défini du tout, je fais ceci:la source
Ici foo () est une fonction qui a un paramètre nommé argValue. Si nous ne passons rien dans l'appel de fonction ici, alors la fonction throwIfNoValue () sera appelée et le résultat retourné sera assigné au seul argument argValue. C'est ainsi qu'un appel de fonction peut être utilisé comme paramètre par défaut. Ce qui rend le code plus simple et plus lisible.
Cet exemple a été tiré d'ici
la source
Si vous utilisez,
ES6+
vous pouvez définir les paramètres par défaut de la manière suivante:Si vous avez besoin de
ES5
syntaxe, vous pouvez le faire de la manière suivante:Dans la syntaxe ci-dessus, l'
OR
opérateur est utilisé. L'OR
opérateur renvoie toujours la première valeur si elle peut être convertietrue
sinon, elle renvoie la valeur de droite. Lorsque la fonction est appelée sans argument correspondant, la variable de paramètre (bar
dans notre exemple) est définieundefined
par le moteur JS.undefined
Est ensuite converti en faux et l'OR
opérateur renvoie donc la valeur 0.la source
Oui, l'utilisation des paramètres par défaut est entièrement prise en charge dans ES6 :
ou
mais avant dans ES5, vous pouviez facilement faire ceci:
Ce qui signifie que si la valeur est là, utilisez la valeur, sinon, utilisez la deuxième valeur après l'
||
opération qui fait la même chose ...Remarque: il y a également une grande différence entre ceux-ci si vous passez une valeur à ES6, même la valeur est fausse, qui sera remplacée par une nouvelle valeur, quelque chose comme
null
ou""
... mais ES5 un seul sera remplacé si seule la valeur transmise est vrai, c'est parce que la façon de||
travailler ...la source
Si, pour une raison quelconque, vous n'êtes pas sous ES6 et êtes utilisé
lodash
ici est une manière concise par défaut des paramètres de fonction via la_.defaultTo
méthode:Qui définira la valeur par défaut si la valeur actuelle est NaN , nulle ou non définie
la source
Sons du futur
À l'avenir, vous pourrez "propager" un objet à un autre (actuellement à partir de 2019 NON pris en charge par Edge !) - démonstration comment l'utiliser pour de belles options par défaut indépendamment de l'ordre:
Référence MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
... en attendant, ce que Edge DOES prend en charge est Object.assign () (IE ne le fait pas, mais j'espère vraiment que nous pourrons laisser IE derrière :))
De même, vous pourriez faire
EDIT: En raison des commentaires concernant les
const
options - le problème avec l'utilisation d'options constantes dans le reste de la fonction n'est pas que vous ne pouvez pas le faire, c'est simplement que vous ne pouvez pas utiliser la variable constante dans sa propre déclaration - vous auriez pour ajuster la dénomination d'entrée à quelque chose commela source
function(opt){ const opt = /*some merging*/; }
? Cela ne fonctionnera certainement pas parce que vous utiliseriez uneconst
variable avant qu'elle ne soit déclarée - vous devrez ajuster -function test(input_opt){ const opt = { someKey: 'someDefaultValue', ...input_opt} }
Juste pour montrer mes compétences aussi (lol), la fonction ci-dessus peut être écrite même sans avoir d'arguments nommés comme ci-dessous:
ES5 et supérieur
ES6 et supérieur
la source
Le code suivant peut fonctionner dans cette situation, y compris ECMAScript 6 (ES6) ainsi que les versions antérieures.
car la valeur par défaut dans les langues fonctionne lorsque la valeur du paramètre de la fonction est ignorée lors de l'appel, en JavaScript, elle est affectée à undefined . Cette approche ne semble pas attrayante sur le plan du programme mais présente une compatibilité descendante .
la source
Oui, c'est ce qu'on appelle un paramètre par défaut
Les paramètres de fonction par défaut permettent aux paramètres formels d'être initialisés avec des valeurs par défaut si aucune valeur ou indéfinie n'est transmise.
Syntaxe:
La description:
Par défaut, les paramètres des fonctions ne sont pas définis. Cependant, dans certaines situations, il peut être utile de définir une valeur par défaut différente. C'est là que les paramètres par défaut peuvent aider.
Dans le passé, la stratégie générale de définition des valeurs par défaut consistait à tester les valeurs des paramètres dans le corps de la fonction et à attribuer une valeur si elles n'étaient pas définies. Si aucune valeur n'est fournie dans l'appel, sa valeur serait indéfinie. Vous devez définir une vérification conditionnelle pour vous assurer que le paramètre n'est pas indéfini
Avec les paramètres par défaut dans ES2015, la vérification dans le corps de la fonction n'est plus nécessaire. Maintenant, vous pouvez simplement mettre une valeur par défaut dans la tête de fonction.
Exemple des différences:
Différents exemples de syntaxe:
Remplissage indéfini par rapport aux autres valeurs de fausseté:
Même si la valeur est définie explicitement lors de l'appel, la valeur de l'argument num est celle par défaut.
Évalué au moment de l'appel:
L'argument par défaut est évalué au moment de l'appel, donc contrairement à d'autres langages, un nouvel objet est créé à chaque appel de la fonction.
Les paramètres par défaut sont disponibles pour les paramètres par défaut ultérieurs:
Les paramètres déjà rencontrés sont disponibles pour les paramètres par défaut ultérieurs
Fonctions définies à l'intérieur du corps de fonction:
Introduit dans Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). Les fonctions déclarées dans le corps de la fonction ne peuvent pas être référencées dans les paramètres par défaut et lèvent une ReferenceError (actuellement une TypeError dans SpiderMonkey, voir bug 1022967). Les paramètres par défaut sont toujours exécutés en premier, les déclarations de fonction à l'intérieur du corps de la fonction sont évaluées ensuite.
Paramètres sans valeurs par défaut après les paramètres par défaut:
Avant Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2), le code suivant entraînait une SyntaxError. Cela a été corrigé dans le bogue 777060 et fonctionne comme prévu dans les versions ultérieures. Les paramètres sont toujours définis de gauche à droite, remplaçant les paramètres par défaut même s'il existe des paramètres ultérieurs sans valeurs par défaut.
Paramètre déstructuré avec affectation de valeur par défaut:
Vous pouvez utiliser l'affectation de valeur par défaut avec la notation d'affectation destructurante
la source
Une approche différente pour définir les paramètres par défaut consiste à utiliser la table d'objets des arguments, au lieu des arguments directement. Par exemple,
De cette façon, il est facile d'étendre les arguments et de ne pas vous soucier de la différence de longueur d'argument.
la source
La réponse est oui. En fait, de nombreuses langues prennent en charge les paramètres par défaut. Python est l'un d'entre eux:
Même s'il s'agit de code Python 3 en raison des parenthèses, les paramètres par défaut dans les fonctions fonctionnent également dans JS.
Par exemple, et dans votre cas:
Mais parfois, vous n'avez pas vraiment besoin de paramètres par défaut.
Vous pouvez simplement définir la variable juste après le début de la fonction, comme ceci:
Dans mes deux exemples, cela renvoie la même chose. Mais parfois, ils pourraient en fait être utiles, comme dans des projets très avancés.
Donc, en conclusion, les valeurs des paramètres par défaut peuvent être utilisées dans JS. Mais c'est presque la même chose que de définir une variable juste après le début de la fonction. Cependant, ils sont parfois encore très utiles. Comme vous l'avez peut-être remarqué, les valeurs de paramètre par défaut prennent 1 ligne de code en moins que la manière standard qui définit le paramètre juste après le démarrage de la fonction.
EDIT: Et c'est super important! Cela ne fonctionnera pas dans IE. Voir documentation . Donc, avec IE, vous devez utiliser la méthode "définir une variable en haut de la fonction". Les paramètres par défaut ne fonctionneront pas dans IE.
la source
Oui, cela fonctionnera en Javascript. Vous pouvez également le faire:
la source