2011-01-22 27 views
7

कुछ भाषाओं आप समारोह के तर्कों के लिए डिफ़ॉल्ट मान सेट कर सकते हैं में:जे एस: कार्यों तर्क मूलभूत मूल्यों

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

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

+0

की [JavaScript फ़ंक्शन के लिए एक डिफ़ॉल्ट पैरामीटर मान सेट करें] संभव डुप्लिकेट (http://stackoverflow.com/questions/894860/set- एक-डिफ़ॉल्ट-पैरामीटर-मूल्य-के-जावास्क्रिप्ट-फ़ंक्शन) – vaxquis

+0

संभावित डुप्लिकेट [क्या जावास्क्रिप्ट में वैकल्पिक फ़ंक्शन पैरामीटर करने का कोई बेहतर तरीका है?] (http: // stackoverflow। कॉम/प्रश्न/148901/एक-बेहतर-तरीका-करने-करने-करने-वैकल्पिक-फ़ंक्शन-पैरामीटर-इन-जावास्क्रिप्ट) – vaxquis

उत्तर

15

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

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

आपको थोड़ी देर में कटौती का एक सा ले जा सकते हैं अगर आप पता है कि वे मूल्य क्या होंगे:

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

हालांकि, यदि वे तर्क गलत हैं, तो उन्हें प्रतिस्थापित कर दिया जाएगा। इसका मतलब यह है कि अगर ARG1 एक खाली स्ट्रिंग, null, undefined, false या 0 यह 50 के लिए बदल दिया जाएगा है, इसलिए सावधान रहना यदि आप इसे

1

आप समारोह शरीर में यह करने के लिए होगा:

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

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

एक और तरीका है उन्हें undefined या null के लिए परीक्षण करने के लिए इस तरह है:

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

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

कुछ लोगों को यह पसंद नहीं है क्योंकि undefined के मान को ओवरराइड करना संभव है क्योंकि यह केवल एक वैश्विक संपत्ति है। जब तक यह ओवरराइड नहीं किया जाता है, यह ठीक काम करेगा। यदि पैरामीटर null या undefined हैं, तो उन्हें डिफ़ॉल्ट पर सेट कर दिया जाएगा।

5

उपयोग करने के लिए चुना है मैं (typeof(arg1) === undefined के बजाय == null जांच पसंद करते हैं jQuery के रूप में पुस्तकालय आंतरिक रूप से करता है: http://docs.jquery.com/JQuery_Core_Style_Guidelines#JSLint)। न केवल यह संक्षिप्त है, यह शून्य और अपरिभाषित दोनों को भी संभालता है, ताकि ग्राहक कोड null में पास हो और डिफ़ॉल्ट लागू हो सके।

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

तो तुम कुछ इस तरह कर सकता है:

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

और defaults() के कार्यान्वयन कुछ इस तरह दिखेगा:

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); 
    } 
} 
बेशक

, कि अपरीक्षित कोड और जिस तरह से यह लिखा है है, यह प्रोटोटाइप पुस्तकालय की आवश्यकता है।लेकिन यह सब कहा, समारोह के अंदर == null दृष्टिकोण जावास्क्रिप्ट को और अधिक प्राकृतिक है, (यदि आप किसी अन्य समारोह परत से निकलने के लिए नहीं है) डिबग करने के लिए आसान है, और मैं इसे पढ़ने में आसान लगता है:

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

प्रतिक्रिया के लिए धन्यवाद। जिस तरह से jQuery दिशानिर्देशों को ब्लॉक में ब्रेसिज़ का उपयोग करने की आवश्यकता होती है। मैं भी इसे पसंद करता हूँ। तो मुझे लगता है कि 'arg1 == null && arg1 = 50' जैसे कुछ सही होगा (मैं जेएस में ऑपरेटर प्राथमिकता के बारे में निश्चित नहीं हूं)? – SaltLake

1

ES2015 (ES6) के रूप में, डिफ़ॉल्ट पैरामीटर इसलिए की तरह सेट किया जा सकता है:

function multiply (a, b = 2) { 
    return a * b; 
} 
multiply(5); // 10 
संबंधित मुद्दे