सवाल जावास्क्रिप्ट फ़ंक्शन के लिए डिफ़ॉल्ट पैरामीटर मान सेट करें


मैं एक जावास्क्रिप्ट फ़ंक्शन को वैकल्पिक तर्क प्राप्त करना चाहता हूं जिसे मैंने डिफ़ॉल्ट पर सेट किया है, जो मान को परिभाषित नहीं किया जाता है। रुबी में आप इसे इस तरह से कर सकते हैं:

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

क्या यह जावास्क्रिप्ट में काम करता है?

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

2022
2018-05-21 20:07


मूल




जवाब:


ES6 / ES2015 से, डिफ़ॉल्ट पैरामीटर भाषा विनिर्देशन में है।

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

बस काम करता है।

संदर्भ: डिफ़ॉल्ट पैरामीटर्स - एमडीएन

डिफ़ॉल्ट फ़ंक्शन पैरामीटर औपचारिक पैरामीटर को डिफ़ॉल्ट मानों के साथ प्रारंभ करने की अनुमति देते हैं कोई मूल्य नहीं या अपरिभाषित पारित कर दिया गया है।

आप भी कर सकते हैं डिफ़ॉल्ट अनुकरण करें नामित विनाश के माध्यम से पैरामीटर:

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

बहुत सारे तरीके हैं, लेकिन यह मेरी पसंदीदा विधि है - यह आपको झूठी या शून्य सहित, जो कुछ भी आप चाहते हैं उसे पार करने देता है। (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



आप इसे इस तरह समेकित भी कर सकते हैं: function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; } और फिर आप इसे कॉल कर सकते हैं a = defaultFor(a, 42); - Camilo Martin
@SiPlus और उपयोग करने का प्रयास करते समय आपको मुफ्त में अतिरिक्त संदर्भ त्रुटियां मिलीं undefined ऑब्जेक्ट्स: पी यहां तक ​​कि यह कुछ ब्राउज़रों के साथ काम कर सकता है और तेजी से हो सकता है, null अभी भी एक वस्तु है और undefined प्राचीन प्रकार का संदर्भ है जो यह बताने की कोशिश कर रहा है कि यहां कुछ भी नहीं है, यहां तक ​​कि यहां तक ​​कि नहीं null। संक्षेप में, दोनों मामलों को यहां देखें: जावास्क्रिप्ट / संदर्भ / Global_Objects / अपरिभाषित। - Sampo Sarrala
यदि आप किसी ऑब्जेक्ट की संपत्ति के विरुद्ध जांच करते हैं, तो typeof अनावश्यक है function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; } यह संदर्भ त्रुटियों को फेंक नहीं देगा और संक्षेप में है। - Dziamid
मुझे पता है कि यह वास्तव में मामूली है, लेकिन मुझे यह पसंद नहीं है कि आप कैसे असाइन कर रहे हैं a = a तथा b = b जब वे पैरामीटर अपरिभाषित नहीं होते हैं। साथ ही, थोड़ी जटिल स्थिति वाले उस टर्नरी ऑपरेटर को भविष्य के रखरखाव के लिए पढ़ना मुश्किल हो सकता है। मैं निम्नलिखित वाक्यविन्यास पसंद करेंगे: if (typeof a == 'undefined') a = 42 - कोई अनावश्यक असाइनमेंट प्लस पढ़ने के लिए थोड़ा आसान नहीं है। - Daddy32
उपयोग करने का कोई कारण है typeof? बस इतना करना प्रतीत होता है a === undefined। इसके अलावा यदि आप गलत वर्तनी करते हैं तो आपको एक संदर्भ त्रुटि मिल जाएगी undefined बनाम इसे एक स्ट्रिंग में डाल दिया। - Abe Voelker


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

यह असाइन करता है delete_after का मूल्य delete_after अगर यह नहीं है falsey मूल्य अन्यथा यह स्ट्रिंग असाइन करता है "my default here"। अधिक जानकारी के लिए, जांचें डॉग क्रॉकफोर्ड का भाषा का सर्वेक्षण और ऑपरेटर पर अनुभाग देखें

यदि आप एक में पास करना चाहते हैं तो यह दृष्टिकोण काम नहीं करता है falsey मूल्य i.e. false, null, undefined, 0 या ""। यदि आपको आवश्यकता है falsey आपको पास किए जाने वाले मूल्यों को विधि का उपयोग करने की आवश्यकता होगी टॉम रिटर का जवाब

किसी फ़ंक्शन में कई पैरामीटर से निपटने पर, उपभोक्ता को किसी ऑब्जेक्ट में पैरामीटर तर्कों को पार करने की अनुमति देने के लिए अक्सर उपयोगी होता है और फिर विलय इन मानों को किसी ऑब्जेक्ट के साथ जिसमें फ़ंक्शन के लिए डिफ़ॉल्ट मान होते हैं

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

उपयोग करने के लिए

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



मुझे यह अपर्याप्त लगता है, क्योंकि मैं झूठी में गुजरना चाहता हूं। - Tom Ritter
मुझे लगता है कि यह ज्यादातर स्थितियों के लिए पर्याप्त है - Russ Cam
यह 0 के लिए भी काम नहीं करता है :( - Alex Kahn
यह किसी भी झूठे मूल्य के लिए काम नहीं करता है - Russ Cam
क्योंकि यह झूठी मूल्यों के लिए काम नहीं करता है, यह रखरखाव दुःस्वप्न पैदा कर सकता है। कुछ कोड जो हमेशा सत्य मूल्यों को पारित कर दिया गया है और अचानक विफल रहता है क्योंकि एक झूठा व्यक्ति पारित किया जाना चाहिए, जहां शायद एक और मजबूत दृष्टिकोण उपलब्ध हो। - jinglesthula


मुझे इस तरह कुछ सरल और व्यक्तिगत रूप से पठनीय होने के लिए कुछ आसान लगता है।

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

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

137
2018-05-21 20:18



अद्यतन: यदि आप उपयोग कर रहे हैं Underscore.js पहले से ही मुझे इसका उपयोग करने के लिए बेहतर लगता है _.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});। इस उत्तर में दिखाए गए वैश्विक नामस्थान का उपयोग करना बहुत से लोगों द्वारा खराब अभ्यास माना जाता है। आप इस सामान्य कार्य के लिए अपनी खुद की उपयोगिता को रोल करने पर भी विचार कर सकते हैं (उदाहरण के लिए। util.default(arg, "defaul value")) अगर अंडरस्कोर का उपयोग नहीं करना चाहते हैं, लेकिन मैं ज्यादातर अंडरस्कोर का उपयोग जल्दी या बाद में कर रहा हूं, फिर भी पहिया को पुनर्निर्मित करने में कोई बात नहीं है। - andersand
@andersand मुझे कुछ पसंद का विचार पसंद है util.default(arg, "defaul value")) क्या आप या @ tj111 दिमाग एक त्वरित डेमो पोस्टिंग करेंगे? - JasonDavis
मैं वास्तव में इस की सिफारिश करता हूं, मैं इसका उपयोग करता हूं और इसे "पोर" कहता हूं जो "पैरामीटर" या " - super
टाइपऑफ arg == 'अपरिभाषित' मत कहें, इसके बजाय arg === अपरिभाषित कहें - OsamaBinLogin
@OsamaBinLogin जो आप कहते हैं वह वर्तमान जेएस के लिए सही है - पुराना परीक्षण बनी रहती है क्योंकि कुछ ब्राउज़रों पर इसे ओवरराइट करना संभव होता था undefined कुछ अन्य मूल्य के साथ, परीक्षण विफल होने का कारण बनता है। - Alnitak


ईसीएमएस्क्रिप्ट 6 में आप वास्तव में वास्तव में लिखने में सक्षम होंगे:

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

यह सेट होगा delete_after सेवा मेरे false अगर यह मौजूद नहीं है या undefined। आप आज इस तरह की ईएस 6 सुविधाओं का उपयोग कर सकते हैं जैसे कि ट्रांसपेलर जैसे कोलाहल

अधिक जानकारी के लिए एमडीएन आलेख देखें


54
2018-05-29 15:25



ईसीएमएस्क्रिप्ट 6 मुझे लगता है ... (मैं अपने आप को सही कर दूंगा लेकिन मैं संपादन नहीं कर सकता <6 वर्ण) - Zac
ब्राउज़र के लिए इंतजार कर किसी भी ईसीएमएस्क्रिप्ट 6 प्राप्त करें - Adriano Resende
बेबेल इसे कैसे पारदर्शी करेगा? - harryg
@harryg: babeljs.io/repl/... - Felix Kling
ES6 के लिए संगतता तालिका यहां दी गई है kangax.github.io/compat-table/es6/#default_function_parameters दुर्भाग्य से यह वाक्यविन्यास अभी तक समर्थित नहीं है। - freemanoid


डिफ़ॉल्ट पैरामीटर मान

ईएस 6 के साथ, आप शायद सबसे आम मुहावरों में से एक कर सकते हैं JavaScript फ़ंक्शन पैरामीटर के लिए डिफ़ॉल्ट मान सेट करने से संबंधित है। जिस तरह से हमने इसे वर्षों से किया है, वह काफी परिचित दिखना चाहिए:

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

यह पैटर्न सबसे अधिक उपयोग किया जाता है, लेकिन जब हम मूल्यों को पास करते हैं तो खतरनाक होता है

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

क्यूं कर? क्यों कि 0 is falsy, और इसलिए x || 11 results in 11, सीधे 0 में पारित नहीं किया गया है। इस गोचा को ठीक करने के लिए, कुछ लोग इसके बजाय चेक को अधिक verbosely लिखेंगे:

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

अब हम एक अच्छे सहायक वाक्यविन्यास की जांच कर सकते हैं ES6 अनुपलब्ध तर्कों के लिए डिफ़ॉल्ट मानों के असाइनमेंट को व्यवस्थित करने के लिए:

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 एक समारोह घोषणा में अधिक पसंद है x !== undefined ? x : 11 अधिक आम मुहावरे की तुलना में x || 11

डिफ़ॉल्ट मूल्य अभिव्यक्तियां

Function डिफ़ॉल्ट मान 31 जैसे साधारण मानों से अधिक हो सकते हैं; वे कोई मान्य अभिव्यक्ति हो सकती है, यहां तक ​​कि ए 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

जैसा कि आप देख सकते हैं, डिफ़ॉल्ट मान अभिव्यक्तियों का आलसी मूल्यांकन किया जाता है, जिसका अर्थ है कि वे केवल तभी चलते हैं जब उनकी आवश्यकता होती है - यानी, जब पैरामीटर का तर्क छोड़ा जाता है या अनिर्धारित होता है।

एक डिफ़ॉल्ट मान अभिव्यक्ति एक इनलाइन फ़ंक्शन अभिव्यक्ति कॉल भी हो सकती है - जिसे आमतौर पर तत्काल आमंत्रण फ़ंक्शन अभिव्यक्ति के रूप में जाना जाता है (IIFE):

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

18
2017-10-15 17:58





जेएस में मेरे लिए यह समाधान काम है:

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

8
2017-11-16 11:29



क्या होता है जब delete_after है 0 या null? यह इन मामलों के लिए सही काम नहीं करेगा। - Dmitri Pavlutin
@StephanBijzitter यह केवल कुछ मामलों में सच होगा। लेकिन अगर आप केवल डिफ़ॉल्ट मानों को मूल्यों को अनसेट करने के लिए चाहते हैं तो यह काम नहीं करता है, क्योंकि 0 या शून्य! === झूठी। - Rutrus
@ रूटस: मैंने जो कुछ भी कहा है उसे मैं समझ नहीं पा रहा हूं। - Stephan Bijzitter
व्हाट अबाउट delete_after = delete_after === undefined ? false : delete_after? - aashah7


बस अपरिभाषित के साथ एक स्पष्ट तुलना का उपयोग करें।

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

6
2017-11-16 07:34





लंबे समय से सी ++ डेवलपर (वेब ​​विकास के लिए रूकी :)), जब मैं पहली बार इस स्थिति में आया, तो मैंने फ़ंक्शन परिभाषा में पैरामीटर असाइनमेंट किया, जैसा कि इस प्रकार प्रश्न में उल्लिखित है।

function myfunc(a,b=10)

लेकिन सावधान रहें कि यह लगातार ब्राउज़र में काम नहीं करता है। मेरे लिए यह मेरे डेस्कटॉप पर क्रोम पर काम किया, लेकिन एंड्रॉइड पर क्रोम पर काम नहीं किया। सुरक्षित विकल्प, जैसा कि ऊपर उल्लेख किया गया है -

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

इस उत्तर का इरादा उसी समाधान को दोहराना नहीं है, जो दूसरों ने पहले से ही उल्लेख किया है, लेकिन यह सूचित करने के लिए कि फ़ंक्शन परिभाषा में पैरामीटर असाइनमेंट कुछ ब्राउज़रों पर काम कर सकता है, लेकिन इस पर भरोसा न करें।


5
2018-05-19 06:40



फ़ंक्शन परिभाषा के भीतर असाइनमेंट आईई 11 में भी काम नहीं करता है, जो विंडोज 8.1 के लिए आईई का सबसे वर्तमान संस्करण है। - DiMono
अगर किसी के आश्चर्य की बात है, function myfunc(a,b=10) ES6 वाक्यविन्यास है, अन्य उत्तरों में संगतता तालिकाओं के लिंक हैं। - gcampbell