Définir une valeur de paramètre par défaut pour une fonction JavaScript

J'aimerais qu'une fonction JavaScript possède des arguments facultatifs pour lesquels je définis une valeur par défaut, qui sont utilisés si la valeur n'est pas définie (et ignorés si la valeur est passée). En Ruby, vous pouvez le faire comme suit :

def read_file(file, delete_after = false)
  # code
end

Cela fonctionne-t-il en JavaScript ?

function read_file(file, delete_after = false) {
  // Code
}
Solution

Depuis [ES6/ES2015][1], les paramètres par défaut sont dans la spécification du langage.

function read_file(file, delete_after = false) {
  // Code
}

fonctionne simplement.

Référence : Paramètres par défaut - MDN

Les paramètres de fonction par défaut permettent d'initialiser les paramètres formels avec des valeurs par défaut si aucune valeur ou undefined est transmis.

Vous pouvez également [simuler des paramètres nommés par défaut via la déstructuration] (http://exploringjs.com/es6/ch_parameter-handling.html#sec_named-parameters) :

// 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 y a beaucoup de façons, mais c'est ma méthode préférée - elle vous permet de passer tout ce que vous voulez, y compris false ou null. (typeof null == "object")

function foo(a, b) {
  a = typeof a !== 'undefined' ? a : 42;
  b = typeof b !== 'undefined' ? b : 'default_b';
  ...
}

[1] : https://www.ecma-international.org/ecma-262/6.0/

Commentaires (26)
function read_file(file, delete_after) {
    delete_after = delete_after || "my default here";
    //rest of code
}

Ceci assigne à delete_after la valeur de delete_after si ce n'est pas une valeur falsey sinon il assigne la chaîne "my default here". Pour plus de détails, consultez [l'étude de Doug Crockford sur le langage et regardez la section sur les opérateurs][1].

Cette approche ne fonctionne pas si vous voulez passer une valeur falsey, c'est-à-dire false, null, undefined, 0 ou "". Si vous souhaitez que des valeurs falsifiantes soient transmises, vous devez utiliser la méthode décrite dans [la réponse de Tom Ritter][2].

Lorsqu'on a affaire à un certain nombre de paramètres d'une fonction, il est souvent utile de permettre au consommateur de passer les arguments des paramètres dans un objet, puis de fusionner ces valeurs avec un objet contenant les valeurs par défaut de la fonction.

function read_file(values) {
    values = merge({ 
        delete_after : "my default here"
    }, values || {});

    // rest of code
}

// simple implementation based on $.extend() from jQuery
function merge() {
    var obj, name, copy,
        target = arguments[0] || {},
        i = 1,
        length = arguments.length;

    for (; i < length; i++) {
        if ((obj = arguments[i]) != null) {
            for (name in obj) {
                copy = obj[name];

                if (target === copy) {
                    continue;
                }
                else if (copy !== undefined) {
                    target[name] = copy;
                }
            }
        }
    }

    return target;
};

à utiliser

// will use the default delete_after value
read_file({ file: "my file" }); 

// will override default delete_after value
read_file({ file: "my file", delete_after: "my value" }); 

[1] : http://crockford.com/javascript/survey.html [2] : https://stackoverflow.com/questions/894860/how-do-i-make-a-default-value-for-a-parameter-to-a-javascript-function/894877#894877

Commentaires (17)

Je trouve personnellement que quelque chose de simple comme ça est beaucoup plus concis et lisible.

function pick(arg, def) {
   return (typeof arg == 'undefined' ? def : arg);
}

function myFunc(x) {
  x = pick(x, 'my default');
} 
Commentaires (7)