2012-08-12 12 views
5

एक उदाहरण समारोह यहां डालें:बातिल का उपयोग कर पारित कर दिया मापदंडों के लिए जाँच - जावास्क्रिप्ट

function a(b){ 
    console.log(b != null ? 1 : 2); 
} 

कि कोड ठीक काम करता है, मुद्रण 1 यदि आप एक पैरामीटर पारित द्वारा, और 2 यदि आप ऐसा नहीं करते।

हालांकि, जेएसलिंट मुझे चेतावनी देता है, मुझे सख्त बराबरता का उपयोग करने के लिए कह रहा है, यानी !==। चाहे कोई पैरामीटर पास हो या नहीं, भले ही !== का उपयोग करते समय फ़ंक्शन 1 प्रिंट करेगा।

तो मेरा सवाल यह है कि पैरामीटर पारित किया गया है या नहीं, यह जांचने का सबसे अच्छा तरीका क्या है? मैं arguments.length का उपयोग नहीं करना चाहता, या वास्तव में arguments ऑब्जेक्ट का उपयोग कर सकता हूं।

मैं इस उपयोग करने की कोशिश:

function a(b){ 
    console.log(typeof(b) !== "undefined" ? 1 : 2); 
} 

^कि काम करने के लिए लग रहा था, लेकिन यह सबसे अच्छा तरीका है?

+2

यदि आप 'अपरिभाषित' पास करते हैं तो आपको झूठा नकारात्मक मिलेगा। 'तर्क। लम्बाई' (या वेरिएंट) यह देखने का एकमात्र तरीका है कि तर्क पारित किया गया था या नहीं। – Esailija

+0

@Esailija यदि यह अनिश्चित मूल्य के साथ स्पष्ट रूप से काम करने के लिए फ़ंक्शन का इरादा नहीं है, तो यह ठीक है imo। यह संभवतः प्रत्येक उपयोगकर्ताफॉल्ट को पकड़ने की कार्यवाही की ज़िम्मेदारी नहीं है। – Christoph

+0

@ क्रिस्टोफ यदि आपको वास्तव में यह जानने की आवश्यकता है कि कोई तर्क पारित किया गया है तो यह ठीक नहीं है। यदि आप सिर्फ यह जानना चाहते हैं कि तर्क खाली है या जो भी हो, तो '! = Null' '! == अपरिभाषित' और इसी तरह सभी नाजुक और अच्छे हैं, इसमें कोई बुलेटप्रूफ नहीं है। एक ही समय में 'अपरिभाषित' और 'शून्य' की जांच करने के लिए '! = Null' पसंद करें। – Esailija

उत्तर

4

जब कोई तर्क पारित नहीं होता है, bundefined है, null नहीं है। तो, तर्क b के अस्तित्व के लिए परीक्षण करने के लिए उचित तरीके से यह है:

function a(b){ 
    console.log(b !== undefined ? 1 : 2); 
} 

!== की सिफारिश की है क्योंकि बातिल और अपरिभाषित अगर आप == या !=, लेकिन का उपयोग !== या === का उपयोग कर बराबर हो मजबूर किया जा सकता है होगा टाइप जबरदस्त न करें ताकि आप सख्ती से बता सकें कि यह undefined है या नहीं।

+2

पूर्णता के लिए, फ़ंक्शन के अंदर 'टाइपोफ़' से छुटकारा पाना संभव है, क्योंकि हम फ़ंक्शन स्कोप में हैं, और 'अपरिभाषित' को यहां ओवरराइट नहीं किया जा सकता है :) वैश्विक दायरे में , 'typeof (foo) का उपयोग करना सुरक्षित है! == "अपरिभाषित" '। –

2

आप undefined की falsy प्रकृति (एक पैरामीटर है, जो पारित नहीं किया गया था, null तथ्य undefined में है नहीं) और का उपयोग सिर्फ लिख सकते हैं:

(!b)?1:2 

हालांकि यह भी 0, null के लिए सच हो जाएगा और "" (झूठी मान)।

आप इसे बुलेटप्रूफ रास्ता लिखना चाहते हैं, तो आप जा सकते हैं:

typeof(b) === "undefined" 
// or thanks to the write protection for undefined in html5 
b === undefined 

अद्यतन: ECMAScript 2015 धन्यवाद, अब हम default parameters उपयोग कर सकते हैं:

function a(b = 1){ 
    console.log(b); 
} 

एक पैरामीटर अपरिभाषित है - या तो ओमेटेड या स्पष्ट रूप से सौंप दिया गया है (यहां आपको null का उपयोग करना चाहिए) - डिफ़ॉल्ट मान का उपयोग किया जाएगा, अन्य सभी मान अपरिवर्तित रहते हैं (झूठी भी)। Demonstration

+0

बीटीडब्ल्यू यदि आप फ़ंक्शन को पास किए गए चर के लिए डिफ़ॉल्ट मान का उपयोग नहीं करना चाहते हैं, तो आप 'b = b || जैसे sth लिख सकते हैं। defaultValue'। यह 'if (! B) {b = defaultValue;}' के लिए एक सामान्य जेएस मुहावरे है - उपरोक्त के समान प्रतिबंधों के साथ ('! बी' सही है यदि' बी' या तो '0', 'false',' null ', 'अपरिभाषित' या' "" ')। –

+1

@ jakub.g यह एक बुरा विचार है, क्योंकि आप कभी भी इस तरह पैरामीटर के रूप में '0' या' "" पास नहीं कर सकते हैं। डिफ़ॉल्ट मानों के साथ काम करते समय आपको इसे सुरक्षित तरीके से जांचना चाहिए और झूठी प्रकृति का उपयोग नहीं करना चाहिए। – Christoph

+0

यह सही है। हालांकि अधिक समझ में आता है जब अपेक्षित पैरामीटर एक वस्तु होना चाहिए ('बी = बी || {}')। –

संबंधित मुद्दे