2011-01-22 18 views
7

: Eğer JavaScript bunu yapmak nasılJS: fonksiyonlar argümanlar varsayılan değerler fonksiyonun bağımsız değişkenler için varsayılan değerler ayarlayabilirsiniz Bazı dillerde

function Foo(arg1 = 50, arg2 = 'default') { 
    //... 
} 

?

+0

[JavaScript işlevi için bir varsayılan parametre değeri ayarlayın] olası yinelenen (http://stackoverflow.com/questions/894860/set- a-default-parameter-value-for-a-javascript işlevi) – vaxquis

+0

olası bir kopyası [Javascript'te isteğe bağlı işlev parametreleri yapmak için daha iyi bir yol var mı?] (http: // stackoverflow. com/questions/148901/is-there-a-daha iyi-yapılacak-isteğe bağlı-işlev-parametreleri-in-javascript) – vaxquis

cevap

15

JavaScript'te, ayarlanmamış olan herhangi bir şey undefined değeri verilir. Bu, bir işlev için varsayılan değerleri ayarlamak isterseniz bu değerler tanımlanmış değilse, ilk satır görmek için bir onay olması gerektiği anlamına gelir:

function Foo(arg1, arg2) { 
    if (typeof(arg1) === "undefined") { arg1 = 50; } 
    if (typeof(arg2) === "undefined") { arg2 = "default"; } 
} 

Kısa bir kesim biraz alabilir eğer bu değerler ne olacağını kabaca biliyorum: bu argümanlar falsy ise

function Foo(arg1, arg2) { 
    arg1 = arg1 || 50; 
    arg2 = arg2 || "default"; 
} 

Ancak, bunlar değiştirilmelidir edeceğiz. bunu

1

Sen fonksiyonu vücut yapmak gerekir:

function Foo(arg1 ,arg2) { 
    if(typeof arg1 === 'undefined') 
     arg1 = 50; 

    if(typeof arg2 === 'undefined') 
     arg2 = 'default'; 
    //... 
} 

undefined veya null için onları test için başka bir yol şu şekildedir: Bazı insanlar çünkü sevmiyorum

function Foo(arg1 ,arg2) { 
    if(arg1 == undefined) 
     arg1 = 50; 

    if(arg2 == undefined) 
     arg2 = 'default'; 
    //... 
} 

Sadece global bir özellik olduğu için undefined değerini geçersiz kılmak mümkündür. Geçersiz kılmadığı sürece, bu iyi çalışır. Parametreler null veya undefined ise, bunlar bir varsayılana ayarlanır.

5

kullanmayı seçtiyseniz, bu jQuery olarak (yerine typeof(arg1) === undefined ait == null çek tercih arg1 bu oran 50 olarak değiştirildi olacak boş bir dize, null, undefined, false veya 0 ise, bu yüzden dikkatli olun demektir kütüphane dahili olarak yapar: http://docs.jquery.com/JQuery_Core_Style_Guidelines#JSLint). Sadece daha özlü olmakla kalmaz, aynı zamanda hem null hem de undefined işlemlerini gerçekleştirir, böylece istemci kodu null'dan geçer ve varsayılanı uygular.

Ayrıca işlevi varsayılan değerleri sağlayan başka bir işlevde de sarmak mümkündür. Prototypejs kitaplığı, argumentNames()'u sağlayan bir işleve sahiptir (veya prototip kullanmak istemiyorsanız, yalnızca uygulamayı ödünç alabilirsiniz; bu yalnızca işlevin toString() sonucuna karşılık gelen bir normal ifadedir). Böyle bir şey olmazdı

var Foo = defaults(Foo, { arg1: 50, arg2: 'default' }); 
function Foo(arg1, arg2) { 
    //... 
} 

Ve defaults() uygulanmasını:

Yani böyle bir şey yapabileceğini

Tabii
function defaults(fn, def) { 
    return function() { 
    var arg_names = fn.argumentNames(); 
    var nArgs = args.length; 
    for (var nArg = 0; nArg < nArgs; ++nArg) { 
     if (arguments[nArg] == null && arg_names[nArg] in def) 
     arguments[nArg] = def[arg_names[nArg]]; 
    } 
    fn.apply(this, arguments); 
    } 
} 

, o denenmemiş kod ve yazıldığı şekilde, bu kadar Prototip kitaplığı gerektirir.Ancak tüm bu, işlevi içinde == null yaklaşım Javascript daha doğal geliyor, (siz gezinmek için başka fonksiyon katmanı yok) ayıklama daha kolaydır ve bunu daha kolay okumak için bulmak:

function Foo(arg1, arg2) { 
    if (arg1 == null) arg1 = 50; 
    if (arg2 == null) arg2 = 'default'; 
} 
+0

Yanıt için teşekkürler. Bu arada jQuery yönergeleri bloklarda kullanılmak üzere parantez gerektirir. Ben de bunu tercih ederim. Sanırım arg1 == null && arg1 = 50' gibi bir şey doğru olurdu (JS'de operatörlerin önceliğinden emin değilim)? – SaltLake

1

ES2015 (ES6) itibariyle varsayılan parametreleri şöyle ayarlanabilir:

function multiply (a, b = 2) { 
    return a * b; 
} 
multiply(5); // 10 
İlgili konular