Задаване на стойност на параметър по подразбиране за функция на JavaScript

Бих искал една функция на JavaScript да има незадължителни аргументи, за които да задам стойност по подразбиране, която да се използва, ако стойността не е определена (и да се игнорира, ако стойността е предадена). В Ruby можете да го направите по следния начин:

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

Работи ли това в JavaScript?

function read_file(file, delete_after = false) {
  // Code
}
Решение

От ES6/ES2015 параметрите по подразбиране са в спецификацията на езика.

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

просто работи.

Справка: Параметри по подразбиране - MDN

Параметрите на функцията по подразбиране позволяват формалните параметри да бъдат инициализирани със стойности по подразбиране, ако е предадена без стойност или неопределена.

Можете също така да симулирате наименувани параметри по подразбиране чрез деструктиране:

// 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
    ···
}

Преди ES2015,

Има много начини, но това е предпочитаният от мен метод - той ви позволява да подавате всичко, което искате, включително false или null. (typeof null == "object")

function foo(a, b) {
  a = typeof a !== 'undefined' ? a : 42;
  b = typeof b !== 'undefined' ? b : 'default_b';
  ...
}
Коментари (26)
function read_file(file, delete_after) {
    delete_after = delete_after || "my default here";
    //rest of code
}

Това присвоява на delete_after стойността на delete_after, ако тя не е фалшива стойност, в противен случай се присвоява низът "my default here". За повече подробности вижте Doug Crockford's survey of the language (преглед на езика) и разгледайте раздела за операторите.

Този подход не работи, ако искате да подадете неясна стойност, т.е. false, null, undefined, 0 или "". Ако искате да предадете фалшиви стойности, ще трябва да използвате метода в отговора на Том Ритър.

Когато се работи с няколко параметъра на функция, често е полезно да се позволи на потребителя да предаде аргументите на параметрите в обект и след това да свърже тези стойности с обект, който съдържа стойностите по подразбиране за функцията

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;
};

да се използва

// 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" }); 
Коментари (17)

Лично аз смятам, че нещо просто като това е много по-сбито и лесно за четене.

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

function myFunc(x) {
  x = pick(x, 'my default');
} 
Коментари (7)