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


2366

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

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

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

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

जवाबों:


3296

से 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';
  ...
}

216
आप इसे इस तरह से एनकैप्सुलेट भी कर सकते हैं: function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; }और फिर आप इसे इस प्रकार कह सकते हैंa = defaultFor(a, 42);
कैमिलो मार्टिन

6
@SiPlus और आपको undefinedवस्तुओं का उपयोग करने की कोशिश के दौरान अतिरिक्त संदर्भ त्रुटियां मिलीं : p भले ही यह कुछ ब्राउज़रों के साथ काम कर सकता है और तेजी से हो सकता है, nullअभी भी एक वस्तु है और undefinedआदिम प्रकार का संदर्भ है जो यह बताने की कोशिश कर रहा है कि यहाँ कुछ भी नहीं null। यहां देखें, संक्षेप में दोनों मामले: जावास्क्रिप्ट / संदर्भ / Global_Objects / अपरिभाषित
सम्पो सरला - codidact.org

9
यदि आप किसी वस्तु की संपत्ति के खिलाफ जांच करते हैं, तो typeofबेमानी है। function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; }यह संदर्भ त्रुटियों को फेंक नहीं देगा और संक्षिप्त है।
डेज़ियामिड

10
मुझे पता है कि यह वास्तव में मामूली है, लेकिन मुझे यह पसंद नहीं है कि आप कैसे काम कर रहे हैं a = aऔर b = bजब वे पैरामीटर अपरिभाषित नहीं हैं। इसके अलावा, थोड़ा जटिल स्थिति के साथ टर्नरी ऑपरेटर भविष्य के रखरखाव के लिए पढ़ना मुश्किल हो सकता है। मैं सिंटैक्स का पालन करना पसंद करूंगा: if (typeof a == 'undefined') a = 42- कोई अनावश्यक असाइनमेंट और पढ़ने में थोड़ा आसान।
डैडी 32

12
क्या उपयोग करने का कोई कारण है typeof? यह सिर्फ करने के लिए सरल प्रतीत होता है a === undefined। इसके अलावा अगर आपको कोई त्रुटि आती है तो आप एक संदर्भ त्रुटि प्राप्त करेंगे undefined
अबे वोल्कर

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

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

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

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

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

115
मुझे यह अपर्याप्त लगता है, क्योंकि मैं झूठे में पारित करना चाहता हूं।
टॉम रिटर

52
मुझे लगता है कि यह अधिकांश स्थितियों के लिए पर्याप्त है
रसम कैम

50
क्योंकि यह गलत मूल्यों के लिए काम नहीं करता है, इसलिए यह एक बुरा सपना बना सकता है। एक बिट कोड जिसे हमेशा पहले सत्य मान दिया गया है और अचानक विफल हो जाता है क्योंकि एक गलत तरीके से पारित किया गया है, शायद उससे बचा जाना चाहिए जहां अधिक मजबूत दृष्टिकोण उपलब्ध है।
जिंगलेथुला

1
कैसे इस मामले में, delete_afterअभिव्यक्ति का बूलियन परिणाम नहीं मिलता है delete_after || "my default value"?
xbonez

3
या, आप बस एक फाल्सी वैल्यू के लिए डिफॉल्ट कर सकते हैं - जो आम तौर पर वैसे भी एक अच्छा डिफॉल्ट होता है (उदाहरण के लिए, बूल्स के लिए गलत, स्ट्रिंग्स के लिए खाली स्ट्रिंग, नंबर के लिए 0, आदि) - जिस स्थिति में यह वास्तव में मायने नहीं रखता है कि क्या था। में पारित;
मार्क ब्रैकेट

150

मुझे कुछ सरल लगता है जैसे व्यक्तिगत रूप से अधिक संक्षिप्त और पठनीय होना।

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

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

6
अद्यतन: यदि आप पहले से ही अंडरस्कोर का उपयोग कर रहे हैं। तो मुझे पहले से ही इसका उपयोग करना बेहतर लगता है _.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});। इस उत्तर में दिखाए गए वैश्विक नामस्थान का उपयोग करना कई लोगों द्वारा एक बुरा व्यवहार माना जाता है। यदि आप util.default(arg, "defaul value")अंडरस्कोर का उपयोग नहीं करना चाहते हैं, तो आप इस सामान्य कार्य (जैसे। ) के लिए अपनी उपयोगिता को रोल करने पर विचार कर सकते हैं , लेकिन मैं ज्यादातर अंडरस्कोर का उपयोग करना चाहता हूं जो कि जल्द ही या फिर पहिया को सुदृढ़ करने के लिए कोई मतलब नहीं है।
andandand

2
मैं वास्तव में यह सलाह देता हूं, मैं इसका उपयोग करता हूं और इसे "पोर" कहता हूं जो "पैरामीटर या" के लिए खड़ा है
सुपर

2
टाइपोफ़ arg == 'अपरिभाषित' न कहें, इसके बजाय arg === अपरिभाषित
कहें

3
@OsamaBinLogin जो आप कहते हैं वह वर्तमान जेएस के लिए सही है - पुराना परीक्षण जारी है क्योंकि कुछ ब्राउज़रों पर यह undefinedकुछ अन्य मूल्य के साथ ओवरराइट करने के लिए संभव हुआ करता था , जिससे परीक्षण विफल हो गया।
अलनीतक

2
@Alnitak: यह अभी भी ओवरराइड करना संभव है undefined। तो, यह अभी भी उपयोग करने के लिए एक अच्छा विचार है typeofऔर 'undefined'
एलएस

63

ECMAScript 6 में आप वास्तव में वही लिख पाएंगे जो आपके पास है:

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

यदि यह मौजूद नहीं है या यह सेट delete_afterहो जाएगा । आप इस तरह की ES6 सुविधाओं का उपयोग आज कर सकते हैं जैसे कि बैबल जैसे ट्रांसपॉयलर ।falseundefined

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


1
ECMAScript 6 मुझे लगता है ... (मैं खुद ही सही हो जाता लेकिन मैं संपादन नहीं कर सकता <6 char)
Zac

1
ब्राउज़र की प्रतीक्षा में किसी को भी ECMAScript 6
Adriano Resende

1
क्या कोलाहल यह करने के लिए transpile होगा?
११


2
यहाँ ES6 kangax.github.io/compat-table/es6/#default_function_parameters के लिए संगतता तालिका है। दुर्भाग्य से यह वाक्यविन्यास अभी तक समर्थित नहीं है
19

27

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

ES6 के साथ, आप शायद 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. इस गोत्र को ठीक करने के लिए, कुछ लोग इसके बजाय चेक को अधिक क्रियात्मक रूप से लिखेंगे:

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

13

वह समाधान js में मेरे लिए काम कर रहा है:

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

4
अगर होता delete_afterहै 0या क्या होता है null? यह इन मामलों के लिए सही काम नहीं करेगा।
दिमित्री पाव्लुटिन

@StephanBijzitter कुछ मामलों में ही सही होगा। लेकिन अगर आप केवल डिफ़ॉल्ट मानों को मानों को अनसेट करना चाहते हैं, तो यह काम नहीं किया, क्योंकि 0 या शून्य! === झूठी।
रट्रस

@ सूत्र: आपने जो कुछ भी कहा, मुझे समझ में नहीं आता।
Stephan Bijzitter

किस बारे में delete_after = delete_after === undefined ? false : delete_after?
आषा 7

10

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

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

10

मैं जावास्क्रिप्ट में डिफ़ॉल्ट पैरामीटर मानों का उपयोग करते समय अत्यधिक सावधानी की सिफारिश करूंगा। यह अक्सर कीड़े से उत्पन्न होने वाला की तरह उच्च आदेश कार्यों के साथ संयोजन के रूप में इस्तेमाल किया forEach, mapऔर reduce। उदाहरण के लिए, कोड की इस पंक्ति पर विचार करें:

['1', '2', '3'].map(parseInt); // [1, NaN, NaN]

parseInt में एक वैकल्पिक दूसरा पैरामीटर function parseInt(s, [मूलांक है,=10]) लेकिन parseIntतीन तर्कों के साथ मैप कॉल : ( तत्व , सूचकांक और सरणी )।

मेरा सुझाव है कि आप अपने आवश्यक पैरामीटरों को अपने वैकल्पिक / डिफ़ॉल्ट मूल्यवान तर्क बनाते हैं। यदि आपका फ़ंक्शन 1,2, या 3 आवश्यक पैरामीटर लेता है, जिसके लिए कोई डिफ़ॉल्ट मान मायने नहीं रखता है, तो उन्हें फ़ंक्शन के लिए स्थितीय पैरामीटर बनाएं, किसी भी वैकल्पिक पैरामीटर को किसी एकल ऑब्जेक्ट की नामित विशेषताओं के रूप में पालन करना चाहिए। यदि आपका फ़ंक्शन 4 या अधिक लेता है, तो शायद यह एकल ऑब्जेक्ट पैरामीटर की विशेषताओं के माध्यम से सभी तर्कों की आपूर्ति करने के लिए अधिक समझ में आता है।

आपके मामले में मेरा सुझाव है कि आप इस तरह अपने deleteFile समारोह लिखें: ( प्रति संपादित instead की टिप्पणी ) ...

// unsafe
function read_file(fileName, deleteAfter=false) {
    if (deleteAfter) {
        console.log(`Reading and then deleting ${fileName}`);
    } else {
        console.log(`Just reading ${fileName}`);
    }
}

// better
function readFile(fileName, options) {
  const deleteAfter = !!(options && options.deleteAfter === true);
  read_file(fileName, deleteAfter);
}

console.log('unsafe...');
['log1.txt', 'log2.txt', 'log3.txt'].map(read_file);

console.log('better...');
['log1.txt', 'log2.txt', 'log3.txt'].map(readFile);

उपरोक्त स्निपेट को चलाने से अप्रयुक्त मापदंडों के लिए डिफ़ॉल्ट तर्क मूल्यों के पीछे छिपे खतरों को दर्शाया गया है।


1
यह "बेहतर समाधान" काफी अपठनीय है। मैं इसके बजाय चर प्रकार की जाँच करने typeof deleteAfter === 'bool'और अपवाद को फेंकने की सलाह दूंगा। इसके अलावा नक्शे / फ़ॉर्च आदि जैसी विधियों का उपयोग करने के मामले में बस उन्हें सावधानी के साथ उपयोग करें और अनाम फ़ंक्शन के साथ फ़ंक्शन को लपेटें। ['1', '2', '3'].map((value) => {read_file(value);})
बजाय

ये एक अच्छा बिंदु है। मैं अपने कोड स्निपेट में पुस्तकालयों के उपयोग से बचने की कोशिश कर रहा था, लेकिन शुद्ध ईवास्क्रिप्ट में यह मुहावरा काफी गड़बड़ है। व्यक्तिगत रूप से, मैं हटाए जाने के बाद लॉश के getतरीके का उपयोग करूंगा। एक अपवाद फेंकना अगर typeof 'deleteAfter' !== 'bool'एक अच्छा विवेकपूर्ण उपाय भी हो सकता है। मुझे ऐसे तरीकों को डिजाइन करना पसंद नहीं है जिनके लिए कॉलर को "सावधानी बरतने" की आवश्यकता होती है। सावधानी समारोह की जिम्मेदारी है, कॉल करने वाले की नहीं। अंतिम व्यवहार कम से कम आश्चर्य के सिद्धांत का पालन करना चाहिए।
डग कोबर्न

मैं मानता हूं, उस तरीके को लिखा नहीं जाना चाहिए, जिससे उसे कॉल किया जा सके, उसके व्यवहार को तोड़ा जा सके। लेकिन ध्यान रखें कि फ़ंक्शन मॉडल की तरह है, और कॉलर नियंत्रक की तरह है। मॉडल को डाटा प्रोसेसिंग का ध्यान रखना चाहिए। फ़ंक्शन (विधि) को उस डेटा की अपेक्षा करनी चाहिए, गलत तरीके से पारित किया जा सकता है और इसे संभाल सकता है। इसीलिए एक्सेप्शन को फेंकने के लिए पैरामीटर के प्रकार की जाँच करना सबसे अच्छा तरीका है। हालांकि यह अधिक जटिल है। लेकिन फिर भी यह आपको अपना सिर खरोंचने से बचा सकता है और पूछ सकता है ... क्यों यह काम नहीं कर रहा है ?! और फिर ... यह क्यों काम कर रहा है ?!
इसके बजाय

9

एक अद्यतन के रूप में ... ECMAScript 6 के साथ आप कर सकते हैं अंत में समारोह पैरामीटर घोषणाओं में सेट डिफ़ॉल्ट मान इतना चाहते:

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

f(1) === 50

के रूप में संदर्भित - http://es6-features.org/#DefaultParameterValues


11
यह उत्तर उपयोगी नहीं है क्योंकि यह एक डुप्लिकेट है
उपयोगकर्ता

8

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

function myfunc(a,b=10)

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

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

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


3
फ़ंक्शन परिभाषा के भीतर असाइनमेंट IE 11 में भी काम नहीं करता है, जो विंडोज 8.1 के लिए IE का सबसे वर्तमान संस्करण है।
डायमोनो

1
किसी की सोच के मामले में, function myfunc(a,b=10)ES6 सिंटैक्स है, अन्य उत्तरों में संगतता तालिकाओं के लिंक हैं।
gcampbell

7

Microsoft एज में कोड काम करने में रुचि रखने वाले किसी भी व्यक्ति के लिए, फ़ंक्शन मापदंडों में चूक का उपयोग न करें।

function read_file(file, delete_after = false) {
    #code
}

उस उदाहरण में एज "एक्सपेक्टिंग ')' '' 'एरर को फेंक देगा।

इस उपयोग के आसपास पाने के लिए

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

अगस्त 08 2016 तक यह अभी भी एक मुद्दा है


4

सिंटेक्स के अनुसार

function [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) {
   statements
}

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


4
function helloWorld(name, symbol = '!!!') {
    name = name || 'worlds';
    console.log('hello ' + name + symbol);
}

helloWorld(); // hello worlds!!!

helloWorld('john'); // hello john!!!

helloWorld('john', '(>.<)'); // hello john(>.<)

helloWorld('john', undefined); // hello john!!!

helloWorld(undefined, undefined); // hello worlds!!!

4

यदि आप नवीनतम ECMA6सिंटैक्स का उपयोग करना चाहते हैं तो इसका उपयोग करें :

function myFunction(someValue = "This is DEFAULT!") {
  console.log("someValue --> ", someValue);
}

myFunction("Not A default value") // calling the function without default value
myFunction()  // calling the function with default value

इसे कहते हैं default function parameters। यदि कोई मान या अपरिभाषित पास नहीं है, तो यह औपचारिक मानों को डिफ़ॉल्ट मानों के साथ आरंभ करने की अनुमति देता है। नोट : यह इंटरनेट एक्सप्लोरर या पुराने ब्राउज़रों के साथ काम नहीं करेगा।

अधिकतम संभव संगतता के लिए इसका उपयोग करें:

function myFunction(someValue) {
  someValue = (someValue === undefined) ? "This is DEFAULT!" : someValue;
  console.log("someValue --> ", someValue);
}

myFunction("Not A default value") // calling the function without default value
myFunction()  // calling the function with default value

दोनों फ़ंक्शन का एक समान व्यवहार है क्योंकि इनमें से प्रत्येक उदाहरण इस तथ्य पर निर्भर करता है कि पैरामीटर चर होगा undefinedयदि उस फ़ंक्शन को कॉल करते समय कोई पैरामीटर मान पारित नहीं किया गया था।


नोट: जैसा @BlackBeard कहता है, फ़ंक्शन (param = value) IE के साथ काम करेगा। संगत संस्करण का उपयोग करें।
मैजिकलैम्प

4

ईएस 6: जैसा कि पहले से ही ज्यादातर जवाबों में बताया गया है, ईएस 6 में, आप बस एक मान के साथ एक पैरामीटर इनिशियलाइज़ कर सकते हैं।


ES5: क्योंकि वहाँ अवसरों जहां मैं इस तरह के रूप falsey मूल्यों पारित करने के लिए हो सकता है दिए गए उत्तर से अधिकांश मेरे लिए नहीं काफी अच्छा कर रहे हैं 0, nullऔर undefinedएक समारोह के लिए। यह निर्धारित करने के लिए कि क्या कोई पैरामीटर अपरिभाषित है क्योंकि वह मान जो मैंने अपरिभाषित के बजाय पास किया है, क्योंकि मुझे यह परिभाषित नहीं किया गया है:

function foo (param1, param2) {
   param1 = arguments.length >= 1 ? param1 : "default1";
   param2 = arguments.length >= 2 ? param2 : "default2";
}

3

function throwIfNoValue() {
throw new Error('Missing argument');
}
function foo(argValue = throwIfNoValue()) {
return argValue ;
}

यहाँ foo () एक फ़ंक्शन है जिसमें एक पैरामीटर है जिसका नाम argValue है। यदि हम यहां फ़ंक्शन कॉल में कुछ भी पास नहीं करते हैं, तो फ़ंक्शन थ्रू नॉनवैल्यू () कहा जाएगा और लौटा परिणाम केवल तर्क argValue को सौंपा जाएगा। यह एक फ़ंक्शन कॉल को डिफ़ॉल्ट पैरामीटर के रूप में कैसे उपयोग किया जा सकता है। जो कोड को अधिक सरल और पठनीय बनाता है।

इसका उदाहरण यहाँ से लिया गया है


3

यदि आप उपयोग कर रहे हैं तो आप ES6+निम्न तरीके से डिफ़ॉल्ट पैरामीटर सेट कर सकते हैं:

function test (foo = 1, bar = 2) {
  console.log(foo, bar);
}

test(5); // foo gets overwritten, bar remains default parameter

यदि आपको ES5सिंटैक्स की आवश्यकता है तो आप इसे निम्नलिखित तरीके से कर सकते हैं:

function test(foo, bar) {
  foo = foo || 2;
  bar = bar || 0;
  
  console.log(foo, bar);
}

test(5); // foo gets overwritten, bar remains default parameter

उपरोक्त सिंटैक्स में ORऑपरेटर का उपयोग किया जाता है। ORऑपरेटर हमेशा पहले मान देता है यह करने के लिए परिवर्तित किया जा सकता है, तो trueनहीं तो यह righthandside मान देता है। जब फ़ंक्शन को संबंधित तर्कों के साथ नहीं बुलाया जाता है, तो पैरामीटर चर ( barहमारे उदाहरण में) undefinedजेएस इंजन द्वारा निर्धारित किया जाता है। undefinedफिर झूठे में बदल दिया जाता है और इस तरह ORऑपरेटर 0 मान लौटाता है।


3

हां, डिफ़ॉल्ट मापदंडों का उपयोग करना ES6 में पूरी तरह से समर्थित है :

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

या

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

लेकिन ES5 में पहले आप आसानी से ऐसा कर सकते थे:

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

जिसका मतलब है कि अगर मूल्य है, तो मूल्य का उपयोग करें, अन्यथा, ||ऑपरेशन के बाद दूसरे मूल्य का उपयोग करें जो समान काम करता है ...

ध्यान दें: उन लोगों के बीच भी एक बड़ा अंतर है यदि आप ES6 के लिए एक मान पास करते हैं, यहां तक ​​कि मूल्य भी मिथ्या हो सकता है, जिसे नए मूल्य के साथ बदल दिया जाएगा, जैसे कुछ nullया ""... लेकिन ES5 एक ही प्रतिस्थापित किया जाएगा यदि केवल पारित मूल्य सच है, ऐसा इसलिए है क्योंकि ||काम करने का तरीका ...


2

यदि किसी कारण से आप ईएस 6 पर नहीं हैं और यहां उपयोग कर रहे हैंlodash तो _.defaultToविधि के माध्यम से फ़ंक्शन फ़ंक्शन को डिफ़ॉल्ट करने के लिए एक संक्षिप्त तरीका है :

var fn = function(a, b) {
  a = _.defaultTo(a, 'Hi')
  b = _.defaultTo(b, 'Mom!')

  console.log(a, b)
}

fn()                 // Hi Mom!
fn(undefined, null)  // Hi Mom!
fn(NaN, NaN)         // Hi Mom!
fn(1)                // 1 "Mom!"
fn(null, 2)          // Hi 2
fn(false, false)     // false false
fn(0, 2)             // 0 2
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

यदि वर्तमान मान NaN , अशक्त या अपरिभाषित है तो डिफ़ॉल्ट सेट हो जाएगा


1

भविष्य की आवाज़

भविष्य में, आप एक वस्तु को दूसरे में "फैलाने" में सक्षम होंगे (वर्तमान में 2019 के रूप में एज द्वारा समर्थित नहीं है !) - प्रदर्शन कैसे आदेश के बिना अच्छा डिफ़ॉल्ट विकल्पों के लिए उपयोग करने के लिए:

function test(options) {
    var options = {
       // defaults
       url: 'defaultURL',
       some: 'somethingDefault',
       // override with input options
       ...options
    };
    
    var body = document.getElementsByTagName('body')[0];
    body.innerHTML += '<br>' + options.url + ' : ' + options.some;
}
test();
test({});
test({url:'myURL'});
test({some:'somethingOfMine'});
test({url:'overrideURL', some:'andSomething'});
test({url:'overrideURL', some:'andSomething', extra:'noProblem'});

MDN संदर्भ: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

... इस बीच क्या एज क्या समर्थन करता है Object.assign () (आईई नहीं करता है, लेकिन मुझे वास्तव में उम्मीद है कि हम IE को पीछे छोड़ सकते हैं :))

इसी तरह आप कर सकते थे

    function test(options) {
        var options = Object.assign({
           // defaults
           url: 'defaultURL',
           some: 'somethingDefault',
        }, options); // override with input options
        
        var body = document.getElementsByTagName('body')[0];
        body.innerHTML += '<br>' + options.url + ' : ' + options.some;
    }
    test();
    test({});
    test({url:'myURL'});
    test({some:'somethingOfMine'});
    test({url:'overrideURL', some:'andSomething'});
    test({url:'overrideURL', some:'andSomething', extra:'noProblem'});

संपादित करें:const विकल्पों के संबंध में टिप्पणियों के कारण - बाकी फ़ंक्शन में निरंतर विकल्पों का उपयोग करने के साथ समस्या वास्तव में यह नहीं है कि आप ऐसा नहीं कर सकते हैं, बस यह है कि आप अपनी घोषणा में निरंतर चर का उपयोग नहीं कर सकते हैं - आपके पास होगा इनपुट नामकरण को कुछ इस तरह समायोजित करना

function test(input_options){
   const options = {
     // defaults
     someKey:    'someDefaultValue',
     anotherKey: 'anotherDefaultValue',

     // merge-in input options
     ...input_options
   };

   // from now on use options with no problem
}

समस्या यह है कि आप सामान्य रूप से ऐसा कभी नहीं करना चाहते हैं क्योंकि यह उन विकल्पों को फिर से असाइन करेगा जो पहले से ही परिभाषित हैं लेकिन आप इसे किसी अन्य संस्करण के साथ उपयोग कर सकते हैं जो कि वैध होगा।
फ्रैंक-डस्पीड

समारोह परीक्षण (विकल्प) {/ * विकल्प परिभाषित किया गया है अगर आप स्थिरांक विकल्पों का उपयोग यह एक त्रुटि फेंक होगा = {} अब * /}
खुलकर-dspeed

कोई वैश्विक नहीं जब आप एक फ़ंक्शन बनाते हैं और आप तर्क नाम विकल्पों के रूप में पास होते हैं, तो फ़ंक्शन विकल्प के अंदर फ़ंक्शन (ऑप्ट) के अंदर परिभाषित किया जाता है {} ऑप्ट परिभाषित किया गया है आप उस फ़ंक्शन के अंदर कॉन्स्ट ऑप्ट का उपयोग नहीं कर सकते हैं तो यह बुरा है क्योंकि आप करते हैं चर पुनर्मूल्यांकन यदि आप अक्सर ऐसा करते हैं और यह आपके सामान्य पैटर्न की तरह दिखता है तो यह एक मुद्दा है
फ्रैंक-डीएसपीई

@ google-frank-dspeed आह, क्या आपका मतलब है कि आप ऐसा नहीं कर सकते function(opt){ const opt = /*some merging*/; }? यह निश्चित रूप से काम नहीं करेगा क्योंकि आप घोषित होने से पहलेconst चर का उपयोग करेंगे - आपको समायोजित करना होगा -function test(input_opt){ const opt = { someKey: 'someDefaultValue', ...input_opt} }
jave.web

@ google-frank-dspeed वैसे भी अधिक नए लोग शायद इस बारे में आश्चर्य करेंगे, इसलिए मैंने संपादन करने के लिए कोड को कैसे जोड़ा है :) इसलिए दूसरों के लिए यह इंगित करने के लिए धन्यवाद :)
jave.web

1

बस अपने कौशल का प्रदर्शन करने के लिए (योग्य), उपरोक्त फ़ंक्शन को नीचे दिए गए तर्कों के बिना भी लिखा जा सकता है:

ES5 और ऊपर

function foo() {
    a = typeof arguments[0] !== 'undefined' ? a : 42;
    b = typeof arguments[1] !== 'undefined' ? b : 'default_b';
    ...
}

ES6 और ऊपर

function foo(...rest) {
    a = typeof rest[0] !== 'undefined' ? a : 42;
    b = typeof rest[1] !== 'undefined' ? b : 'default_b';
    ...
}

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

निम्नलिखित कोड ईसीएमएस्क्रिप्ट 6 (ईएस 6) के साथ-साथ पहले के संस्करणों सहित इस स्थिति में काम कर सकते हैं।

function read_file(file, delete_after) {
    if(delete_after == undefined)
        delete_after = false;//default value

    console.log('delete_after =',delete_after);
}
read_file('text1.txt',true);
read_file('text2.txt');

जब कॉल करते समय फ़ंक्शन के पैरामीटर मान को छोड़ दिया जाता है, तो भाषाओं में डिफ़ॉल्ट मान काम करता है, जावास्क्रिप्ट में इसे अपरिभाषित सौंपा जाता है । यह दृष्टिकोण आकर्षक रूप से आकर्षक नहीं दिखता है, लेकिन इसमें पिछड़ी संगतता है


0

हाँ यह एक डिफ़ॉल्ट पैरामीटर के रूप में जाना जाता है

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

वाक्य - विन्यास:

function [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) {
   statements
}

विवरण:

कार्य के पैरामीटर डिफ़ॉल्ट के लिए अपरिभाषित हालांकि, स्थितियों में यह एक अलग डिफ़ॉल्ट मान सेट करने के लिए उपयोगी हो सकता है। यह वह जगह है जहां डिफ़ॉल्ट पैरामीटर मदद कर सकता है।

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

ES2015 में डिफ़ॉल्ट मापदंडों के साथ, फ़ंक्शन बॉडी में चेक अब आवश्यक नहीं है। अब आप केवल फंक्शन हेड में एक डिफ़ॉल्ट मान रख सकते हैं।

मतभेदों का उदाहरण:

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

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


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

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

विभिन्न सिंटैक्स उदाहरण:

अन्य मिथ्या मूल्यों के बिना अपरिभाषित पैडिंग:

भले ही कॉल करते समय मूल्य स्पष्ट रूप से सेट किया गया हो, लेकिन संख्या तर्क का मान डिफ़ॉल्ट होता है।

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

test();          // 'number' (num is set to 1)
test(undefined); // 'number' (num is set to 1 too)

// test with other falsy values:
test('');        // 'string' (num is set to '')
test(null);      // 'object' (num is set to null)

कॉल समय पर मूल्यांकन:

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

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

append(1); //[1]
append(2); //[2], not [1, 2]


// This even applies to functions and variables
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.')

फ़ंक्शन बॉडी के अंदर परिभाषित कार्य:

गेको 33 (फ़ायरफ़ॉक्स 33 / थंडरबर्ड 33 / सीमोंकी 2.30) में पेश किया गया। फ़ंक्शन बॉडी में घोषित किए गए फ़ंक्शंस को डिफ़ॉल्ट मापदंडों के अंदर नहीं भेजा जा सकता है और एक रेफ़रर्रर (वर्तमान में स्पाइडरमॉन्की में एक टाइपर, बग 1022967 देखें) फेंक सकते हैं। डिफ़ॉल्ट मापदंडों को हमेशा पहले निष्पादित किया जाता है, फ़ंक्शन बॉडी के अंदर फ़ंक्शन घोषणाएं बाद में मूल्यांकन करते हैं।

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

डिफ़ॉल्ट मापदंडों के बाद चूक के बिना पैरामीटर:

जेको 26 (फ़ायरफ़ॉक्स 26 / थंडरबर्ड 26 / सीमॉन्की 2.23 / फ़ायरफ़ॉक्स ओएस 1.2) से पहले, निम्न कोड के परिणामस्वरूप सिंटैक्सएर्रर हुआ। यह बग 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

0

डिफ़ॉल्ट पैरामेट्स सेट करने के लिए बस एक अलग तरीका है, तर्कों के बजाय सीधे तर्कों के ऑब्जेक्ट मैप का उपयोग करना। उदाहरण के लिए,

const defaultConfig = {
 category: 'Animals',
 legs: 4
};

function checkOrganism(props) {
 const category = props.category || defaultConfig.category;
 const legs = props.legs || defaultConfig.legs;
}

इस तरह, तर्कों का विस्तार करना आसान है और तर्क की लंबाई के बारे में चिंता न करें।


-1

इसका जवाब है हाँ। वास्तव में, कई भाषाएं हैं जो डिफ़ॉल्ट मापदंडों का समर्थन करती हैं। अजगर उनमें से एक है:

def(a, enter="Hello"):
   print(a+enter)

भले ही यह कोष्ठक के कारण पायथन 3 कोड है, लेकिन फ़ंक्शन में डिफ़ॉल्ट पैरामीटर जेएस में भी काम करते हैं।

उदाहरण के लिए, और आपके मामले में:

function read_file(file, deleteAfter=false){
  console.log(deleteAfter);
}

read_file("test.txt");

लेकिन कभी-कभी आपको वास्तव में डिफ़ॉल्ट मापदंडों की आवश्यकता नहीं होती है।

आप फ़ंक्शन की शुरुआत के बाद चर को ठीक से परिभाषित कर सकते हैं, जैसे:

function read_file(file){
  var deleteAfter = false;
  console.log(deleteAfter);
}

read_file("test.txt");

मेरे दोनों उदाहरणों में, यह एक ही बात देता है। लेकिन कभी-कभी वे वास्तव में उपयोगी हो सकते हैं, जैसे बहुत उन्नत परियोजनाओं में।

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

संपादित करें: और यह सुपर महत्वपूर्ण है! यहIE में काम नहीं करेगा। प्रलेखन देखें। इसलिए IE के साथ आपको "फ़ंक्शन के शीर्ष पर परिवर्तनीय चर" विधि का उपयोग करना होगा। IE में डिफ़ॉल्ट पैरामीटर काम नहीं करेगा।


-3

हां, यह जावास्क्रिप्ट में काम करेगा। आप ऐसा भी कर सकते हैं:

function func(a=10,b=20)
{
    alert (a+' and '+b);
}

func(); // Result: 10 and 20

func(12); // Result: 12 and 20

func(22,25); // Result: 22 and 25

2
यह वर्तमान में पोर्टेबल नहीं है ... IE ... developer.mozilla.org/en/docs/Web/JavaScript/Reference/… (और यह एक डुप्लिकेट उत्तर है ...)
Gert van den Berg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.