Oletusarvoisen parametrin asettaminen JavaScript-funktiolle

Haluaisin, että JavaScript-funktiolla on valinnaisia argumentteja, joille asetan oletusarvon, jota käytetään, jos arvoa ei ole määritetty (ja jota ei oteta huomioon, jos arvo on annettu). Rubyssä voit tehdä sen näin:

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

Toimiiko tämä JavaScriptissä?

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

ES6/ES2015, oletusparametrit ovat kielen määrittelyssä.

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

vain toimii.

Viite: Oletusparametrit - MDN

Oletusarvoiset funktioparametrit mahdollistavat muodollisten parametrien alustamisen oletusarvoilla, jos ei arvoa tai undefined välitetään.

Voit myös simuloida oletusarvoisia nimettyjä parametreja rakenneuudistuksen avulla:

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

Pre ES2015,

On monia tapoja, mutta tämä on suosikkini - sillä voit syöttää mitä tahansa, myös false tai null. (typeof null == "object"))

function foo(a, b) {
  a = typeof a !== 'undefined' ? a : 42;
  b = typeof b !== 'undefined' ? b : 'default_b';
  ...
}
Kommentit (26)
function read_file(file, delete_after) {
    delete_after = delete_after || "my default here";
    //rest of code
}

Tämä määrittää delete_after:lle delete_after:n arvon, jos se ei ole väärennetty arvo, muutoin se määrittää merkkijonon "minun oletusarvoni tässä". Tarkempia tietoja saat Doug Crockfordin'n katsauksesta kieleen ja tutustu kappaleeseen Operaattorit.

Tämä lähestymistapa ei toimi, jos haluat antaa väärän arvon eli false, null, undefined, 0 tai "". Jos haluat syöttää väärät arvot, sinun on käytettävä Tom Ritterin vastauksessa esitettyä menetelmää.

Kun funktiossa on useita parametreja, on usein hyödyllistä antaa kuluttajan siirtää parametriargumentit objektina ja sulauttaa nämä arvot sitten objektiin, joka sisältää funktion oletusarvot.

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

käytettäväksi

// 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" }); 
Kommentit (17)

Minusta tällainen yksinkertainen muotoilu on paljon tiiviimpi ja helppolukuisempi.

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

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