We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

Οι προεπιλεγμένες παράμετροι συναρτήσεων επιτρέπουν την αρχικοποίηση των παραμέτρων με προεπιλεγμένες τιμες, αν η τιμή λείπει ή ειναι τύπου undefined.

Σύνταξη

function [όνομα]([παράμ1[ = προεπιλεγμένηΤιμή1 ][, ..., παράμN[ = προεπιλεγμένηΤιμήN ]]]) {δηλώσεις
}

Περιγραφή

Στην JavaScript, οι προεπιλεγμένες παράμετροι των συναρτήσεων ειναι τύπου undefined. Ωστόσο, σε κάποιες καταστάσεις μπορεί να χρειαστεί να θέσουμε μια διαφορετική προεπιλεγμένη τιμή. Σε αυτή την περίπτωση μπορούν βοηθήσουν οι προεπιλεγμένες παράμετροι.

Στο παρελθόν, η γενική στρατηγική ορισμού προεπιλεγμένων τιμών, ηταν ο έλεγχος των τιμών στο σώμα την συνάρτησης και η εκχώρηση τιμής στην περίπτωση που ήταν τύπου undefined. Αν στο επόμενο παράδειγμα, δεν δοθεί τιμή για την b οταν κλήθει η συναρτηση, η τιμή της θα ήταν undefined  κατα την εκτίμηση του a*b και η κλήση της multiply θα επέστρεφε NaN. Ωστόσο, αυτό αποτρέπεται στην δεύτερη γραμμή του παραδείγματος:

function multiply(a, b) {
  b = (typeof b !== 'undefined') ?  b : 1;
  return a * b;
}

multiply(5, 2); // 10
multiply(5, 1); // 5
multiply(5);    // 5

Με τις προεπιλεγμένες παραμέτρους στην ES2015, ο έλεγχος στο σώμα της συνάρτησης δεν ειναι πια απαραίτητος. Τωρα μπορούμε απλα να θέσουμε 1 ως προεπιλεγμένη τιμή της b στην κεφαλή της συνάρτησης:

function multiply(a, b = 1) {
  return a * b;
}

multiply(5, 2); // 10
multiply(5, 1); // 5
multiply(5);    // 5

Παραδείγματα

Περνώντας undefined σε αντίθεση με άλλες falsy τιμες

Στην δεύτερη κλήση εδω, ακόμα και αν η δεύτερη παράμετρος είναι ρητά undefined (αλλά οχι null ή άλλες falsy τιμές) κατα την κλήση, η τιμή της παραμέτρου num είναι η προεπιλεγμένη.

function test(num = 1) {
  console.log(typeof num);
}

test();          // 'number' (η num παίρνει τιμή 1)
test(undefined); // 'number' (η num επίσης παίρνει τιμή 1)

// test with other falsy values:
test('');        // 'string' (η num παίρνει τιμή '')
test(null);      // 'object' (η num παίρνει τιμή null)

Εκτίμηση κατα την κλήση

Η προεπιλεγμένη παράμετρος εκτιμάται κατα την κλήση, οπότε αντίθετα με την Python για παραδειγμα, ενα νεο αντικείμενο δημιουργείται καθε φορά που καλείται η συνάρτηση.

function append(value, array = []) {
  array.push(value);
  return array;
}

append(1); //[1]
append(2); //[2], όχι [1, 2]

Αυτό εφαρμόζεται ακομα και στις συναρτήσεις και τις μεταβλητές:

function callSomething(thing = something()) {
 return thing;
}

function something() {
  return 'sth';
}

callSomething();  //sth

Οι προεπιλεγμένες παράμετροι ειναι διαθέσιμες σε επόμενες προεπιλεγμένες παραμέτρους

Οι παράμετροι που εχουν ήδη συναντηθεί είναι διαθέσιμες και στις επόμενες προεπιλεγμένες παραμέτρους:

function singularAutoPlural(singular, plural = singular + 's', 
                            rallyingCry = plural + ' ATTACK!!!') {
  return [singular, plural, rallyingCry]; 
}

//["Gecko","Geckos", "Geckos ATTACK!!!"]
singularAutoPlural('Gecko');

//["Fox","Foxes", "Foxes ATTACK!!!"]
singularAutoPlural('Fox', 'Foxes');

//["Deer", "Deer", "Deer ... change."]
singularAutoPlural('Deer', 'Deer', 'Deer peaceably and respectfully \
   petition the government for positive change.')

Αυτή η λειτουργικότητα υπολογίζεται σταδιακά. Το επόμενο παράδειγμα επιδεικνύει το πως χειρίζονται άλλες ακραίες περιπτώσεις.

function go() {
  return ':P';
}

function withDefaults(a, b = 5, c = b, d = go(), e = this, 
                      f = arguments, g = this.value) {
  return [a, b, c, d, e, f, g];
}

function withoutDefaults(a, b, c, d, e, f, g) {
  switch (arguments.length) {
    case 0:
      a;
    case 1:
      b = 5;
    case 2:
      c = b;
    case 3:
      d = go();
    case 4:
      e = this;
    case 5:
      f = arguments;
    case 6:
      g = this.value;
    default:
  }
  return [a, b, c, d, e, f, g];
}

withDefaults.call({value: '=^_^='});
// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]


withoutDefaults.call({value: '=^_^='});
// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]

Συναρτήσεις που ορίζονται μεσα στο σώμα της συνάρτησης

Εισάχθηκε στο Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). Οι συναρτήσεις που ορίζονται στο σώμα της συνάρτησης δεν μπορούν να αναφέρονται στίς προεπιλεγμένες παραμέτρους και εμφανίζουν ενα ReferenceError (αυτή τη στιγμή TypeError στο SpiderMonkey, βλέπε bug 1022967). Οι προεπιλεγμένες παράμετροι εκτελούνται παντα πρώτες και στην συνέχεια εκτελούνται οι δηλώσεις που βρίσκονται στο σώμα της συνάρτησης.

// Doesn't work! Throws ReferenceError.
function f(a = go()) {
  function go() { return ':P'; }
}

Παράμετροι χωρίς προεπιλεγμένες τιμες μετα τις προεπιλεγμενες παραμέτρους

Πριν απο το Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2), ο ακόλουθος κώδικας προκαλούσε ένα SyntaxError. Αυτό επιδιορθώθηκε στο bug 777060 και έχει την αναμενόμενη λειτουργία σε επόμενες εκδόσεις. Οι παράμετροι ορίζονται ακόμα απο τα αριστερά στα δεξιά, αντικαθιστώντας προεπιλεγμένες παραμέτρους ακόμα και αν υπάρχουν επόμενες παράμετροι χωρίς προεπιλεγμένες τιμές.

function f(x = 1, y) { 
  return [x, y]; 
}

f(); // [1, undefined]
f(2); // [2, undefined]

Αποδόμηση παραμέτρων στον ορισμό προεπιλεγμένων τιμών

Στον ορισμό προεπιλεγμένων παραμέτρων μπορεί να χρησιμοποιηθεί αποδομημένη ανάθεση:

function f([x, y] = [1, 2], {z: z} = {z: 3}) { 
  return x + y + z; 
}

f(); // 6

Προδιαγραφές

Προδιαγραφή Κατάσταση Σχόλιο
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Function Definitions' in that specification.
Standard Αρχικός ορισμός.
ECMAScript Latest Draft (ECMA-262)
The definition of 'Function Definitions' in that specification.
Draft  

Συμβατότητα περιηγητών

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic support491415 No3610
Parameters without defaults after default parameters491426 No3610
Destructured parameter with default value assignment49 ?41 No ? ?
FeatureAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Basic support4949141536105.0
Parameters without defaults after default parameters4949142636105.0
Destructured parameter with default value assignment4949 ?41 ? ?5.0

Δείτε επίσης

Εθελοντές και ετικέτες εγγράφου

Συνεισφέροντες σε αυτή τη σελίδα: mankal111
Τελευταία ενημέρωση από: mankal111,