Soru JavaScript işlevi için varsayılan parametre değeri ayarlayın


Ben bir varsayılan olarak belirlediğim isteğe bağlı argümanlara sahip bir JavaScript işlevi istiyorum, bu değer tanımlanmamışsa kullanılır. Ruby'de bunu şöyle yapabilirsin:

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

Bu JavaScript’de çalışıyor mu?

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

2022
2018-05-21 20:07


Menşei




Cevaplar:


ES6 / ES2015'den, varsayılan parametreler dil özelliğindedir.

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

sadece çalışır.

Referans: Varsayılan Parametreler - MDN

Varsayılan işlev parametreleri, varsayılan parametrelerin varsayılan değerlerle başlatılmasını sağlar. değersiz veya Tanımsız geçilir.

Sen de yapabilirsin varsayılanı simüle et adlı yıkım yoluyla parametreler:

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

Ön ES2015,

Birçok yol var, ama bu benim tercih ettiğim yöntem - yanlış veya null dahil olmak üzere istediğiniz herhangi bir şeyi iletmenize izin veriyor. (typeof null == "object")

function foo(a, b) {
  a = typeof a !== 'undefined' ? a : 42;
  b = typeof b !== 'undefined' ? b : 'default_b';
  ...
}

2937
2018-05-21 20:10



Ayrıca şu şekilde de kapsülleyebilirsiniz: function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; } ve sonra da a = defaultFor(a, 42); - Camilo Martin
@SiPlus ve kullanmaya çalışırken ücretsiz olarak ekstra referans hataları var undefined nesneler: p Bazı tarayıcılarla çalışabilir ve daha hızlı olabilir null hala bir nesne ve undefined Burada hiçbir şey olmadığını söylemeye çalışan ilkel türlere atıfta bulunur, hatta null. Burada, her iki durumda özetle: JavaScript / Referans / Global_Objects / tanımsız. - Sampo Sarrala
Bir nesnenin özelliğine karşı kontrol ederseniz, o zaman typeof gereksizdir. function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; } Bu referans hataları atmayacak ve özlü. - Dziamid
Çok küçük olduğunu biliyorum ama nasıl atadığımı sevmiyorum a = a ve b = b Bu parametreler undefined olmadığında. Ayrıca, biraz karmaşık bir duruma sahip olan bu üçlü operatörün gelecekteki denetçiler için okunması zor olabilir. Sözdizimini takip etmeyi tercih ederim: if (typeof a == 'undefined') a = 42 - Gereksiz ödev ve okunması biraz daha kolay. - Daddy32
Kullanmak için herhangi bir sebep var mı typeof? Sadece yapmak daha kolay görünüyor a === undefined. Ayrıca, yanlış yazmış olursanız referans hatası alırsınız undefined bir dizeye koyarak vs. - Abe Voelker


function read_file(file, delete_after) {
    delete_after = delete_after || "my default here";
    //rest of code
}

Bu atar delete_after değeri delete_after eğer değilse Falsey değer aksi takdirde dizeyi atar "my default here". Daha fazla detay için, göz atın Doug Crockford'un dili araştırması ve Operatörler bölümüne bakın..

Eğer bir geçiş yapmak istiyorsanız, bu yaklaşım işe yaramaz. Falsey değer, yani false, null, undefined, 0 veya "". Eğer gerekiyorsa Falsey İçinde geçirilecek değerler, içindeki yöntemi kullanmanız gerekir Tom Ritter'ın cevabı.

Bir işleve bir dizi parametreyle çalışırken, tüketicinin parametre argümanlarını bir nesnede geçirmesine izin vermek genellikle yararlıdır. birleşmek Bu değerler, işlev için varsayılan değerleri içeren bir nesne ile

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

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

559
2018-05-21 20:09



Bunu yetersiz buluyorum, çünkü yanlış olarak geçmek isteyebilirim. - Tom Ritter
Çoğu durum için yeterli olduğunu düşünüyorum - Russ Cam
Bu da 0. :( için çalışmıyor - Alex Kahn
Herhangi bir falsey değeri için çalışmıyor - Russ Cam
Falsey değerleri için çalışmadığı için bakım kabusu yaratabilir. Her zaman daha önce gerçeğe uygun değerlerden geçmiş olan ve aniden başarısız olan bir kod, çünkü daha sağlam bir yaklaşımın mevcut olduğu yerde, bir kişinin yerine geçmesi muhtemeldir. - jinglesthula


Daha basit ve kişisel olarak okunabilir olmak için böyle basit bir şey buluyorum.

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

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

137
2018-05-21 20:18



Güncelleme: Kullanıyorsanız underscore.js zaten kullanmak daha iyi buluyorum _.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});. Bu cevapta gösterildiği gibi küresel ad alanının kullanılması birçok kişi tarafından kötü bir uygulama olarak kabul edilir. Ayrıca, bu genel görev için kendi kullanımınızı da yuvarlamayı düşünebilirsiniz (ör. util.default(arg, "defaul value")) Eğer alt çizgi kullanmak istemiyorlarsa, ama ben çoğunlukla çarkı yeniden keşfetmenin hiçbir noktasında er ya da geç alt çizgi kullanarak bitiriyorum. - andersand
@andersand gibi bir şey fikrini severim util.default(arg, "defaul value"))  hızlı bir demo yayınlamak ister misin? - JasonDavis
Bunu gerçekten tavsiye ederim, kullanıyorum ve "parametre" veya "parametre" anlamına gelen "por" olarak adlandırıyorum. - super
Arg == 'undefined' yazmayın, bunun yerine arg === undefined - OsamaBinLogin
@OsamaBinLogin dedikleriniz geçerli JS için doğrudur - eski testler devam eder, çünkü bazı tarayıcılarda üzerine yazmak mümkün olabilirdi undefined Başka bir değerle, testin başarısız olmasına neden olur. - Alnitak


ECMAScript 6'da tam olarak sahip olduklarınızı yazabileceksiniz:

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

Bu ayarlanacak delete_after için false eğer mevcut değilse veya undefined. Bu gibi ES6 özelliklerini bugün gibi aktarıcılar ile kullanabilirsiniz. Babil.

Daha fazla bilgi için MDN makalesine bakın.


54
2018-05-29 15:25



ECMAScript 6 Sanırım ... (Kendi başıma düzeltebilirdim ama <6 karakterli bir düzenleme yapamam) - Zac
Tarayıcı için beklemek ECMAScript 6 olsun - Adriano Resende
Babel bunu ne için gönderirdi? - harryg
@harryg: babeljs.io/repl/... - Felix Kling
İşte ES6 için uyumluluk tablosu kangax.github.io/compat-table/es6/#default_function_parameters Ne yazık ki bu sözdizimi henüz desteklenmiyor. - freemanoid


Varsayılan Parametre Değerleri

ES6 ile, belki de en sık kullanılan deyimlerden birini yapabilirsiniz. JavaScript Bir işlev parametresi için bir varsayılan değer ayarlamaya ilişkindir. Bunu yıllardır yapma şeklimiz oldukça tanıdık geliyor:

function foo(x,y) {
 x = x || 11;
 y = y || 31;
 console.log( x + y );
}
foo(); // 42
foo( 5, 6 ); // 11
foo( 5 ); // 36
foo( null, 6 ); // 17

Bu desen en çok kullanılır, ancak

foo(0, 42)
foo( 0, 42 ); // 53 <-- Oops, not 42

Niye ya? Çünkü 0 is falsyve böylece x || 11 results in 11, doğrudan doğruya 0 değil. Bu çatalı düzeltmek için, bazı insanlar bunun yerine daha ayrıntılı olarak çek yazacak:

function foo(x,y) {
 x = (x !== undefined) ? x : 11;
 y = (y !== undefined) ? y : 31;
 console.log( x + y );
}
foo( 0, 42 ); // 42
foo( undefined, 6 ); // 17

şimdi olarak eklenen güzel bir yardımcı sözdizimini inceleyebiliriz ES6 eksik değerlere varsayılan değerlerin atamalarını hızlandırmak için:

function foo(x = 11, y = 31) {
 console.log( x + y );
}

foo(); // 42
foo( 5, 6 ); // 11
foo( 0, 42 ); // 42
foo( 5 ); // 36
foo( 5, undefined ); // 36 <-- `undefined` is missing
foo( 5, null ); // 5 <-- null coerces to `0`
foo( undefined, 6 ); // 17 <-- `undefined` is missing
foo( null, 6 ); // 6 <-- null coerces to `0`

x = 11 bir işlev beyanında daha fazla x !== undefined ? x : 11 çok daha yaygın olan deyimden x || 11

Varsayılan Değer İfadeleri

Function varsayılan değerler, 31 gibi basit değerlerden daha fazlası olabilir; herhangi bir geçerli ifade olabilir, hatta function call:

function bar(val) {
 console.log( "bar called!" );
 return y + val;
}
function foo(x = y + 3, z = bar( x )) {
 console.log( x, z );
}
var y = 5;
foo(); // "bar called"
 // 8 13
foo( 10 ); // "bar called"
 // 10 15
y = 6;
foo( undefined, 10 ); // 9 10

Görebildiğiniz gibi, varsayılan değer ifadeleri temkinli olarak değerlendirilir, yani yalnızca ihtiyaç duyulduğunda ve gerektiğinde çalışırlar - yani, bir parametrenin argümanı atlandığında veya tanımlanmadığında.

Varsayılan bir değer ifadesi, genellikle hemen çağrılan bir işlev ifadesi olarak adlandırılan bir satır içi işlev ifade çağrısı olabilir. (IIFE):

function foo( x =
 (function(v){ return v + 11; })( 31 )
) {
 console.log( x );
}
foo(); // 42

18
2017-10-15 17:58





Bu çözüm js'de benim için çalışıyor:

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

8
2017-11-16 11:29



Olursa ne olur delete_after olduğu 0 veya null? Bu durumlar için doğru olmayacaktır. - Dmitri Pavlutin
@StephanBijzitter sadece bazı durumlarda doğru olurdu. Ancak, yalnızca varsayılan değerlerin değerlerin değerini kaldırmasını istiyorsanız, 0 veya null! === false. - Rutrus
@Rutrus: Az önce söylediğiniz hiçbir şeyi anlamıyorum. - Stephan Bijzitter
Ne dersin delete_after = delete_after === undefined ? false : delete_after? - aashah7


Sadece undefined ile açık bir karşılaştırma kullanın.

function read_file(file, delete_after)
{
    if(delete_after === undefined) { delete_after = false; }
}

6
2017-11-16 07:34





C ++ geliştiricisi (web geliştirmeye Rookie :)), bu duruma ilk kez rastladığımda, parametre tanımını işlev tanımında yaptım.

function myfunc(a,b=10)

Ancak, tarayıcılarda tutarlı bir şekilde çalışmadığından emin olun. Benim için masaüstümde krom üzerinde çalıştı, ancak android üzerinde krom üzerinde çalışmadı. Daha güvenli seçenek, yukarıda belirtildiği gibi -

    function myfunc(a,b)
    {
    if (typeof(b)==='undefined') b = 10;
......
    }

Bu cevabın niyeti, diğerlerinin daha önce bahsettiği aynı çözümleri tekrarlamak değil, ancak işlev tanımındaki bu parametre atamasının bazı tarayıcılarda çalışabileceğini, ancak ona güvenmediğini bildirmektir.


5
2018-05-19 06:40



İşlev tanımı içindeki atama, Windows 8.1 için IE'nin en güncel sürümü olan IE 11'de de çalışmaz. - DiMono
Birinin merak etmesi durumunda, function myfunc(a,b=10) ES6 sözdizimi, diğer yanıtlardaki uyumluluk tablolarına bağlantılar var. - gcampbell


Bir güncelleme olarak ... ECMAScript 6 ile yapabilirsiniz EN SONUNDA Varsayılan değerlerini işlev parametre bildirimlerinde şöyle ayarlayın:

function f (x, y = 7, z = 42) {
  return x + y + z
}

f(1) === 50

Tarafından başvurulan - http://es6-features.org/#DefaultParameterValues


4
2017-10-06 16:16



Bu cevap yararlı değildir çünkü bir kopyasıdır - user