2016-01-04 7 views
35

मैं अभी कुछ परियोजनाओं के साथ ES2015 + विलासिता में बह रहा हूं और सोच रहा हूं कि क्या मैं नए आश्चर्यजनक में undefined की जांच करने के लिए बहुत नफरत वाले क्रच से छुटकारा पा सकता हूं।ES2015/2016 तरीका 'typeof varName ===' अपरिभाषित '?

क्या ईएस2015 + में पहले से ही typeof varName === 'undefined' पर एक छोटा लेकिन अभी भी सही तरीका है?

बेशक मैं default parameters का उपयोग कर सकता हूं लेकिन यह एक अनावश्यक असाइनमेंट की तरह लगता है।

function coolFn(a = null){ 
    if (a===null) console.log("no a supplied"); 
} 
+3

"बेहतर" से आपका क्या मतलब है? – Pointy

+4

पहली जगह में एक प्रकार की जांच का उपयोग क्यों करें? 'अगर (ए === अपरिभाषित)' – epascarello

+0

@ पॉइंटी मुझे लिखने के लिए छोटा था लेकिन अभी भी सभी मामलों को कवर किया गया था। – Hedge

उत्तर

44

बस varName === undefined के लिए जांचें।

पुराने ब्राउज़र में वैश्विक undefined चर के लिए एक वैकल्पिक मूल्य असाइन करना संभव था जिससे परीक्षण विफल हो गया, लेकिन ES2015 + में अब असंभव है।

ध्यान दें कि undefined को arguments.length पर देखकर पैरामीटर को छोड़कर पैरामीटर के रूप में स्पष्ट रूप से गुजरने का कोई तरीका नहीं है।

+0

मुझे यह कैसे याद आ सकता है! हाँ, यह पहले से ही काफी अच्छा है :) मुझे आपके द्वारा वर्णित दोनों मामलों के बीच अंतर करने की आवश्यकता नहीं है। – Hedge

+4

ईएस 5 के बाद से आप वैश्विक 'अपरिभाषित' संपत्ति को बदल नहीं सकते हैं। लेकिन आप अभी भी इसे स्थानीय चर के साथ छाया कर सकते हैं। – Oriol

+0

@ ओरीओल यह सच है, लेकिन यदि आप ऐसा करते हैं तो आप को खुद को दोषी ठहराया गया है। अब आप वैश्विक क्षेत्र में 'अपरिभाषित' के एक अलग मूल्य को "इंजेक्ट" नहीं कर सकते हैं। – Alnitak

18

एकमात्र मामला जहां typeof varName === 'undefined' उपयोगी है जब आप नहीं जानते कि परिवर्तनीय varName घोषित किया गया है या नहीं।

और यदि आप नहीं जानते कि आपके चर घोषित किए गए हैं, तो आपके कोड में गंभीर समस्याएं हैं।

  • varName === void 0

    यह पता लगाने जाएगा कि क्या varName अपरिभाषित है:

    अन्य मामलों में आप बेहतर विकल्प हैं।

    void एक ऑपरेटर है जो एक तर्क प्राप्त करता है (आप 0 के बजाय जो कुछ भी उपयोग कर सकते हैं), और अपरिभाषित लौटाता है।

  • varName === undefined

    यह का पता लगाने चाहिए कि क्या varName अनिर्धारित रहता है।

    हालांकि, वैश्विक undefined को ओवरराइट किया जा सकता था (ES5 से पहले) या किसी अन्य मूल्य के साथ छायांकित हो सकता था। इसलिए मैं void पसंद करता हूं, जो कि छोटा भी है।

  • varName == null

    यह पता लगाने जाएगा कि क्या varName अपरिभाषित है या रिक्त है।

  • !varName

    यह पता लगाने जाएगा कि क्या varName falsy है (अपरिभाषित, अशक्त, 0, खाली स्ट्रिंग, NaN, गलत)।

+0

'शून्य 0' अच्छा है, लेकिन 'शून्य' के बाद से एक विषम वाक्यविन्यास का थोड़ा सा जेएस (यदि कोई है?) में कोई अन्य उपयोग नहीं है और वांछित इरादा व्यक्त नहीं करता है। – Alnitak

+0

यदि आप छोटा चाहते हैं, तो '[] [0]' शून्य 0' से छोटा है। –

+0

@TravisJ जब तक कुछ पागल लिपि नहीं 'Array.prototype [0] = someThing';) – Oriol

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