Bir JavaScript işlevi için varsayılan parametre değeri ayarlama

Bir JavaScript işlevinin, varsayılan olarak ayarladığım ve değer tanımlanmadığında kullanılan (ve değer geçilirse yok sayılan) isteğe bağlı bağımsız değişkenlere sahip olmasını istiyorum. Ruby'de bunu şu şekilde yapabilirsiniz:

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

Bu JavaScript'te çalışıyor mu?

function read_file(file, delete_after = false) {
  // Code
}
Çözüm

ES6/ES2015]1'den itibaren varsayılan parametreler dil spesifikasyonunda yer almaktadır.

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

sadece çalışıyor.

Referans: Varsayılan Parametreler - MDN

Varsayılan fonksiyon parametreleri, değer yok veya tanımsız geçilmesi durumunda resmi parametrelerin varsayılan değerlerle başlatılmasını sağlar.

Ayrıca varsayılan adlı parametreleri yıkım yoluyla simüle edebilirsiniz:

// 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 öncesi,

Birçok yol var, ancak bu benim tercih ettiğim yöntem - false veya null dahil olmak üzere istediğiniz her şeyi geçirmenize izin veriyor. (typeof null == "object")

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

Bu, delete_after değerine, eğer bir falsey değeri değilse delete_after değerini atar, aksi takdirde "my default here" dizesini atar. Daha fazla ayrıntı için Doug Crockford'un dil incelemesine ve Operatörler bölümüne göz atın.

Bu yaklaşım, false, null, undefined, 0 veya "" gibi yanlış bir değer geçmek istediğinizde çalışmaz. Eğer falsey değerlerinin geçirilmesini istiyorsanız Tom Ritter'in cevabı'deki yöntemi kullanmanız gerekir.

Bir fonksiyonun çok sayıda parametresiyle uğraşırken, tüketicinin parametre argümanlarını bir nesne içinde iletmesine ve ardından bu değerleri fonksiyon için varsayılan değerleri içeren bir nesneyle birleştirmesine izin vermek genellikle yararlıdır

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

kullanmak için

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

Şahsen bunun gibi basit bir şeyi çok daha özlü ve okunabilir buluyorum.

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

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