मैंने इस प्रश्न को एक परीक्षण में देखा, जहाँ चर myObj घोषित नहीं किया गया था, और निम्नलिखित if कथनों के आधार पर सही उत्तर चुनने का अनुरोध किया।

function myFunction() {
  if(typeof myObj !== "undefined" && myObj !== null) {
    a = 1
  }
}

result: "undefined" 

इन कथनों को चलाने और आउटपुट का परीक्षण करने के लिए फ़ंक्शन बनाया।

 function myFunction() {
   if(myObj !== null && typeof myObj !== "undefined") {
    a = 1
   }
 }

 result: Uncaught ReferenceError: myObj is not defined

मेरे प्रश्न यह है कि यदि कोई चर परिभाषित नहीं किया गया है, तो क्या यह "अपरिभाषित" जैसा नहीं है, अगर मैं "अपरिभाषित" मान के लिए परीक्षण करना चाहता हूं, तो मैं यह जांचने के लिए "शून्य" का उपयोग कर सकता हूं कि यह अपरिभाषित है (उदाहरण के लिए myObj = == नल), तो मुट्ठी समारोह अपरिभाषित क्यों है और दूसरा रिटर्न myObj परिभाषित नहीं है?

0
bernlt 7 फरवरी 2021, 16:02

2 जवाब

सबसे बढ़िया उत्तर

कुछ चीजें चल रही हैं:

  1. वैल्यू चेक टाइप चेक से अलग होते हैं।

    यदि आप किसी ऐसे पहचानकर्ता के मान को पढ़ने का प्रयास करते हैं जो मौजूद नहीं है, तो आपको एक त्रुटि मिलती है। तो myObj === null त्रुटि उत्पन्न करता है यदि myObj मौजूद नहीं है (पहचानकर्ता को कभी घोषित नहीं किया गया है या अन्यथा नहीं बनाया गया है)।

    लेकिन किसी ऐसे पहचानकर्ता पर typeof का उपयोग करने पर जो मौजूद नहीं है, परिणाम "undefined" बिना किसी त्रुटि के होता है। तो typeof myObj "undefined" है जब myObj मौजूद नहीं है। आप इसे विनिर्देश में देख सकते हैं जहां यह होता है:

    2(a) अगर IsUnresolvableReference(val) सही है, तो "अपरिभाषित" लौटाएं।

  2. && ऑपरेटर शॉर्ट-सर्किट

    && अपने पहले ऑपरेंड का मूल्यांकन करता है और, यदि वह मान मिथ्या है, तो दूसरे ऑपरेंड के साथ कुछ भी नहीं करते हुए, इसके परिणाम के रूप में मिथ्या मान लेता है। यदि पहले ऑपरेंड का मान सत्य है, हालांकि, && दूसरे ऑपरेंड का मूल्यांकन करता है और उस मान को उसके परिणाम के रूप में लेता है।

उन दो चीजों के कारण, if(typeof myObj !== "undefined" && myObj !== null) { बिना किसी त्रुटि के काम करता है क्योंकि यह टाइपऑफ myObj !== "undefined" करता है। code> पहले और, चूंकि वह मान गलत है, जब myObj मौजूद नहीं है, && ऑपरेशन का परिणाम true< है /code> और दूसरे ऑपरेंड का मूल्यांकन कभी नहीं किया जाता है। लेकिन if(myObj !== null && typeof myObj !== "undefined") { पहले myObj !== null करता है, एक पहचानकर्ता के मूल्य का उपयोग करने की कोशिश कर रहा है कि मौजूद नहीं है, जो त्रुटि का कारण बनता है।

मेरे प्रश्न यह है कि यदि एक चर परिभाषित नहीं किया गया है, तो क्या यह "अपरिभाषित" जैसा नहीं है

सामान्य मामले में नहीं, नहीं। typeof विशेष है। पहचानकर्ता के साथ आप जो कुछ भी करते हैं उसके बारे में जो अस्तित्व में नहीं है वह एक त्रुटि उत्पन्न करेगा। (ठीक है, एक और बात है: ढीले मोड में, यदि आप किसी ऐसे पहचानकर्ता को असाइन करते हैं जो मौजूद नहीं है, तो यह एक वैश्विक बनाता है। इसे मैं द हॉरर ऑफ इंप्लिसिट ग्लोबल्स और सख्त मोड, जहां यह त्रुटि हमेशा होनी चाहिए थी।)


"सत्य" और "झूठे" ऐसे शब्द हैं जिनका उपयोग हम जावास्क्रिप्ट में उन vlaues को संदर्भित करने के लिए करते हैं जो true के लिए बाध्य होते हैं और वे मान जो शर्तों के रूप में उपयोग किए जाने पर false के लिए बाध्य होते हैं। झूठे मूल्यों का एक निश्चित सेट है: 0, "", NaN, null, undefined, और निश्चित रूप से, false (भी document.all ब्राउज़र में; अजीब लेकिन सच)। अन्य सभी मूल्य सत्य हैं।

3
T.J. Crowder 7 फरवरी 2021, 16:16

समस्या जावास्क्रिप्ट में && ऑपरेटर की आपकी समझ के साथ है,

एक उदाहरण के साथ समझाते हुए: expr1 && expr2

यदि expr1 को सत्य में परिवर्तित किया जा सकता है, तो expr2 लौटाता है; अन्यथा, expr1 लौटाता है।

आपके पहले मामले में :
myObj टाइप करें! == "अपरिभाषित" // यह गलत है, क्योंकि टाइपऑफ myObj अपरिभाषित है तो यह अपरिभाषित लौटाता है।

आपके दूसरे मामले में: myObj!== "null" // यह Uncaught ReferenceError देता है: myobj परिभाषित नहीं है, क्योंकि यह सत्य नहीं है, वही त्रुटि वापस आती है

1
nayanjyoti sharma 7 फरवरी 2021, 16:17