एक अपरिभाषित वस्तु संपत्ति का पता लगाना


2838

यदि जावास्क्रिप्ट में कोई ऑब्जेक्ट प्रॉपर्टी है, तो जाँच का सबसे अच्छा तरीका क्या है undefined?

जवाबों:


2679

यह जांचने का सामान्य तरीका है कि किसी संपत्ति का मूल्य विशेष मूल्य undefinedहै या नहीं:

if(o.myProperty === undefined) {
  alert("myProperty value is the special value `undefined`");
}

यह जाँचने के लिए कि क्या किसी वस्तु में वास्तव में ऐसी कोई संपत्ति नहीं है, और इसलिए undefinedजब आप कोशिश करते हैं और उस तक पहुँचते हैं तो डिफ़ॉल्ट रूप से वापस आ जाएंगे :

if(!o.hasOwnProperty('myProperty')) {
  alert("myProperty does not exist");
}

यह जांचने के लिए कि क्या किसी पहचानकर्ता से जुड़ा मूल्य विशेष मूल्य है undefined, या यदि वह पहचानकर्ता घोषित नहीं किया गया है। नोट: यह विधि एक अघोषितundefined त्रुटि का उल्लेख करने का एकमात्र तरीका है (ध्यान दें: प्रारंभिक त्रुटि के बिना पहचानकर्ता के मान से भिन्न ):

if(typeof myVariable === 'undefined') {
  alert('myVariable is either the special value `undefined`, or it has not been declared');
}

ECMAScript 5 से पहले जावास्क्रिप्ट के संस्करणों में, वैश्विक ऑब्जेक्ट पर "अपरिभाषित" नाम की संपत्ति लेखन योग्य थी, और इसलिए एक साधारण जांच foo === undefinedअप्रत्याशित रूप से व्यवहार कर सकती है अगर यह गलती से फिर से परिभाषित किया गया था। आधुनिक जावास्क्रिप्ट में, संपत्ति केवल पढ़ने के लिए है।

हालांकि, आधुनिक जावास्क्रिप्ट में, "अपरिभाषित" एक कीवर्ड नहीं है, और इसलिए फ़ंक्शन के अंदर चर को "अपरिभाषित" नाम दिया जा सकता है और वैश्विक संपत्ति को छायांकित कर सकता है।

यदि आप इस (असंभावित) किनारे के मामले से चिंतित हैं, तो आप विशेष मूल्य पर खुद को प्राप्त करने के लिए शून्य ऑपरेटर का उपयोग कर सकते हैं undefined:

if(myVariable === void 0) {
  alert("myVariable is the special value `undefined`");
}

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

5
@ neu-rah आप एक फ़ंक्शन क्यों नहीं लिख सकते हैं? यह काम क्यों नहीं होगा? ऐसा लगता है यह मेरे लिए काम का होगा। क्या कोई ऐसा मामला है जिस पर मैं विचार नहीं कर रहा हूं? jsfiddle.net/djH9N/6
Zack

7
@Zack isNullorUndefined के लिए आपके परीक्षण उस मामले पर विचार नहीं करते हैं जहाँ आप कॉल करते हैं। NullOrUndefined (f) और f अघोषित है (जहाँ कोई "var f" घोषणा नहीं है)।
pnkfelix

109
ब्लाह, अब हजारों वोट। यह इसे करने का सबसे खराब संभव तरीका है। मुझे आशा है कि राहगीर इस टिप्पणी को देखेंगे और जांचने का निर्णय लेंगे ... अहम ... अन्य उत्तर।
Ry-

17
आप अभी उपयोग कर सकते obj !== undefinedहैं। undefinedइसका उपयोग करने योग्य था, जैसे undefined = 1234कि दिलचस्प परिणाम क्या होगा। लेकिन एक्मास्क्रिप्ट 5 के बाद, यह अब लिखने योग्य नहीं है, इसलिए हम सरल संस्करण का उपयोग कर सकते हैं। सांकेतिकता.com
ब्रूनो बुकोलो

899

मेरा मानना ​​है कि इस विषय में कई गलत उत्तर हैं। आम धारणा के विपरीत, "अपरिभाषित" जावास्क्रिप्ट में एक कीवर्ड नहीं है और वास्तव में इसके लिए एक मूल्य निर्धारित किया जा सकता है।

सही कोड

इस परीक्षण को करने का सबसे मजबूत तरीका है:

if (typeof myVar === "undefined")

यह हमेशा सही परिणाम लौटाएगा, और यहां तक ​​कि उस स्थिति को भी संभालता है जहां myVarघोषित नहीं किया गया है।

पतित कोड। प्रयोग नहीं करें।

var undefined = false;  // Shockingly, this is completely legal!
if (myVar === undefined) {
    alert("You have been misled. Run away!");
}

इसके अतिरिक्त, myVar === undefinedउस स्थिति में त्रुटि उत्पन्न होगी जहां myVar अघोषित है।


133
+1 यह ध्यान देने के लिए कि myVar === अपरिभाषित एक त्रुटि उत्पन्न करेगा यदि myVar घोषित नहीं किया गया
Enrique

73
मैं यहाँ पहले औचित्य का पता === undefinedलगाता हूँ, जो बेजुबान का उपयोग नहीं करने के लिए दिया गया है । हां, आप इसे असाइन कर सकते हैं undefined, लेकिन ऐसा करने का कोई वैध कारण नहीं है, और यह अनुमान है कि ऐसा करने से आपका कोड टूट सकता है। C में आप #define true falseऔर Python में आप को असाइन कर सकते हैं Trueऔर False, लेकिन लोग अपने कोड को उन भाषाओं में इस तरह से डिजाइन करने की आवश्यकता महसूस नहीं करते हैं जैसे कि खुद की संभावना के विरुद्ध रक्षा करने के लिए जानबूझकर अपने स्वयं के वातावरण को कोड में कहीं और तोड़फोड़ करते हैं। । undefinedयहाँ पर भी ध्यान देने योग्य होने की संभावना क्यों है ?
मार्क अमेरी

19
मार्क्स की टिप्पणियों के अलावा, मुझे यह नहीं मिलता है: "myVar === अपरिभाषित उस स्थिति में त्रुटि उत्पन्न करेगा जहां myVar अघोषित है।" - यह बुरा क्यों है? यदि मैं अघोषित चर का संदर्भ दे रहा हूं, तो मुझे कोई त्रुटि क्यों नहीं चाहिए?
eis

5
यह भी ध्यान रखें कि आप हमेशा void 0उस मूल्य को प्राप्त करने के लिए कर सकते हैं जो undefinedइंगित करता है। तो आप कर सकते हैं if (myVar === void 0)0विशेष नहीं है, आप सचमुच वहाँ किसी भी अभिव्यक्ति डाल सकते हैं।
क्लॉडिउ

28
आधुनिक ब्राउज़रों (FF4 +, IE9 +, Chrome अज्ञात) में, इसे संशोधित करना संभव नहीं है undefined
एमडीएन

228

यहाँ कई अन्य उत्तरों द्वारा सिफारिश किए जाने के बावजूद, typeof एक बुरा विकल्प है । यह जाँचने के लिए कभी उपयोग नहीं किया जाना चाहिए कि क्या चर का मूल्य है undefined, क्योंकि यह मूल्य के लिए एक संयुक्त जाँच के रूप में कार्य करता है undefinedऔर इसके लिए कि क्या चर मौजूद है। अधिकांश मामलों में, आप जानते हैं कि जब एक चर मौजूद होता है, और typeofयदि आप चर नाम में या स्ट्रिंग शाब्दिक में टाइपो बनाते हैं तो बस एक मौन विफलता की क्षमता का परिचय देंगे 'undefined'

var snapshot = …;

if (typeof snaposhot === 'undefined') {
    //         ^
    // misspelled¹ – this will never run, but it won’t throw an error!
}
var foo = …;

if (typeof foo === 'undefned') {
    //                   ^
    // misspelled – this will never run, but it won’t throw an error!
}

इसलिए जब तक आप फीचर डिटेक्शन नहीं कर रहे हैं, जहां अनिश्चितता है कि क्या एक दिया गया नाम स्कोप में होगा (जैसे typeof module !== 'undefined'कि कॉमनजेस एनवायरनमेंट के लिए विशिष्ट कोड में एक स्टेप के रूप में जांचना ), typeofएक वेरिएबल पर उपयोग किए जाने पर हानिकारक विकल्प है, और सही विकल्प है मूल्य की सीधे तुलना करने के लिए:

var foo = …;

if (foo === undefined) {
    
}

इसके बारे में कुछ आम गलतफहमियों में शामिल हैं:

  • कि एक "uninitialized" वैरिएबल ( var foo) या पैरामीटर ( function bar(foo) { … }, जिसे कहा जाता है bar()) पढ़ना विफल हो जाएगा। यह केवल सच नहीं है - स्पष्ट आरंभीकरण और मापदंडों के बिना चर जो मान नहीं दिए गए थे वे हमेशा बन जाते हैं undefined, और हमेशा दायरे में होते हैं।

  • यह undefinedअधिलेखित किया जा सकता है। इसमें और भी बहुत कुछ है। undefinedजावास्क्रिप्ट में एक कीवर्ड नहीं है। इसके बजाय, यह अनिर्धारित मूल्य के साथ वैश्विक वस्तु पर एक संपत्ति है। हालांकि, ES5 के बाद से, यह संपत्ति केवल-पढ़ने योग्य और गैर-विन्यास योग्य है । कोई भी आधुनिक ब्राउज़र undefinedसंपत्ति को बदलने की अनुमति नहीं देगा , और 2017 तक यह लंबे समय से मामला है। सख्त मोड का अभाव undefinedया तो व्यवहार को प्रभावित नहीं करता है - यह सिर्फ बयान देता है जैसे undefined = 5फेंकने के बजाय कुछ भी नहीं करते हैं। चूंकि यह एक कीवर्ड नहीं है, हालांकि, आप नाम के साथ चर घोषित कर सकते हैं undefined, और उन चर को बदला जा सकता है, जिससे यह एक बार आम हो जाता है:

    (function (undefined) {
        // …
    })()

    वैश्विक उपयोग करने से ज्यादा खतरनाक है undefined। आप ES3-संगत होना है, तो बदलने के undefinedसाथ void 0- का सहारा नहीं है typeof। ( voidहमेशा एक अपरेंटिस ऑपरेटर रहा है जो किसी भी ऑपरेंड के लिए अपरिभाषित मूल्य का मूल्यांकन करता है।)

चर किस तरह से काम करते हैं, यह वास्तविक प्रश्न को संबोधित करने का समय है: वस्तु गुण। typeofऑब्जेक्ट गुण के लिए कभी भी उपयोग करने का कोई कारण नहीं है । फ़ीचर डिटेक्शन के बारे में पहले वाला अपवाद यहां लागू नहीं होता है - typeofकेवल चर पर विशेष व्यवहार होता है, और ऐसे संदर्भ जो ऑब्जेक्ट ऑब्जेक्ट गुण संदर्भ नहीं हैं।

इस:

if (typeof foo.bar === 'undefined') {
    
}

है हमेशा बिल्कुल बराबर this³ रहे हैं:

if (foo.bar === undefined) {
    
}

और ऊपर की सलाह को ध्यान में रखते हुए, पाठकों को भ्रमित करने से बचने के लिए कि आप typeofइसका उपयोग क्यों कर रहे हैं , क्योंकि यह ===समानता के लिए जांच करने के लिए उपयोग करने के लिए सबसे अधिक समझ में आता है , क्योंकि इसे बाद में एक चर के मूल्य की जांच करने के लिए फिर से तैयार किया जा सकता है, और क्योंकि यह सिर्फ सादा है बेहतर लग रहा है, आपको हमेशा === undefinedas यहां भी उपयोग करना चाहिए

ऑब्जेक्ट गुण की बात आने पर विचार करने के लिए कुछ और है कि क्या आप वास्तव undefinedमें सभी के लिए जांचना चाहते हैं । किसी दी गई संपत्ति का नाम किसी वस्तु पर अनुपस्थित हो सकता है ( undefinedजब पढ़ा जाता है तो मान पैदा करता है ), मूल्य के साथ वस्तु पर ही undefinedमौजूद होता है, मूल्य के साथ वस्तु के प्रोटोटाइप undefinedपर मौजूद होता है, या गैर- undefinedमूल्य वाले लोगों में से किसी पर भी मौजूद होता है । 'key' in objआपको बताएगा कि क्या एक वस्तु के प्रोटोटाइप चेन पर कहीं भी एक कुंजी है, और Object.prototype.hasOwnProperty.call(obj, 'key')आपको बताएगा कि क्या यह सीधे ऑब्जेक्ट पर है। मैं इस उत्तर में प्रोटोटाइप के बारे में विस्तार से नहीं जाऊँगा और वस्तुओं को स्ट्रिंग-की-मैप के रूप में उपयोग कर रहा हूँ, हालाँकि, यह ज्यादातर मूल प्रश्न के संभावित व्याख्याओं के बावजूद अन्य सभी खराब सलाह का सामना करने के लिए है। इस पर पढ़ेअधिक के लिए एमडीएन पर वस्तु प्रोटोटाइप !

उदाहरण चर नाम की असामान्य पसंद? यह फ़ायरफ़ॉक्स के लिए NoScript एक्सटेंशन से वास्तविक मृत कोड है।
Not यह मत समझो कि न जाने क्या-क्या गुंजाइश है, सामान्य रूप से ठीक है, हालांकि। डायनेमिक स्कोप के दुरुपयोग के कारण बोनस भेद्यता: प्रोजेक्ट जीरो 1225
again एक बार फिर ईएस 5 + वातावरण मान रहा है और यह वैश्विक वस्तु undefinedकी undefinedसंपत्ति को संदर्भित करता है । स्थानापन्न void 0अन्यथा।


@BenjaminGruenbaum सच है लेकिन पूरी तरह से भ्रामक है। कोई भी गैर-डिफ़ॉल्ट संदर्भ डिफ़ॉल्ट को undefinedछिपाते हुए, अपने स्वयं को परिभाषित कर सकता है । जो अधिकांश व्यावहारिक उद्देश्यों के लिए होता है, उसका प्रभाव उतना ही अधिक होता है।
ब्लोग

23
@blgt व्यावहारिक कुछ भी के लिए अप्रासंगिक और अप्रासंगिक है। हर संदर्भ कंसोल.लॉग को ओवरराइड कर सकता है, ऐरे प्रोटोटाइप तरीकों को फिर से परिभाषित कर सकता है, और यहां तक ​​कि फ़ंक्शन.प्रोटोटाइप.ऑल 'हुकिंग को भी ओवरराइड कर सकता है, और हर बार जब आप जावास्क्रिप्ट में किसी फ़ंक्शन को कॉल करते हैं, तो उसे बदल सकते हैं। इसके विरुद्ध सुरक्षा करना बहुत ही विकट है और मूर्खतापूर्ण है। जैसा कि मैंने (और मिनिटेक ने) कहा, आप void 0अपरिभाषित के खिलाफ तुलना करने के लिए उपयोग कर सकते हैं लेकिन फिर से - यह मूर्खतापूर्ण और ओवरकिल है।
बेंजामिन ग्रुएनबाम

19
काश, मेरे पास देने के लिए एक से अधिक upvote होते। यह सबसे सही उत्तर है। मैं वास्तव typeof something === "undefined") में कोड में देखना बंद करना चाहता हूं ।
साइमन बॉमगार्ड-वेलैंडर

@BenjaminGruenbaum आलसी प्रोग्रामर के लिए, void 0(एक बार के लिए) दोनों छोटे और सुरक्षित हैं! यह मेरी किताब में एक जीत है।
wizzwizz4

4
यह वास्तव में स्वीकृत उत्तर होना चाहिए। यह सबसे संपूर्ण और अद्यतित है।
पैट्रिक माइकेलसेन

161

जावास्क्रिप्ट में अशक्त है और अपरिभाषित है । उनके अलग-अलग अर्थ हैं।

  • अपरिभाषित का अर्थ है कि परिवर्तनीय मूल्य को परिभाषित नहीं किया गया है; यह ज्ञात नहीं है कि मूल्य क्या है।
  • अशक्त का अर्थ है कि परिवर्तनीय मान परिभाषित है और शून्य पर सेट है (जिसका कोई मूल्य नहीं है)।

मेरीजन हवेर्बेके ने कहा, उनकी मुफ्त पुस्तक " एलोक्वेंट जावास्क्रिप्ट " (जोर मेरा) में:

एक समान मूल्य भी है, अशक्त, जिसका अर्थ है 'यह मान परिभाषित है, लेकिन इसका कोई मूल्य नहीं है'। अपरिभाषित और अशक्त के बीच अर्थ में अंतर ज्यादातर अकादमिक है, और आमतौर पर बहुत दिलचस्प नहीं है। व्यावहारिक कार्यक्रमों में, अक्सर यह जांचना आवश्यक होता है कि क्या किसी चीज का 'मूल्य' है। इन मामलों में, अभिव्यक्ति कुछ == अपरिभाषित का उपयोग किया जा सकता है, क्योंकि, भले ही वे बिल्कुल समान मूल्य नहीं हैं, अशक्त == अपरिभाषित सत्य का उत्पादन करेंगे।

इसलिए, मुझे लगता है कि अगर कुछ अपरिभाषित होगा तो जांचने का सबसे अच्छा तरीका है:

if (something == undefined)

उम्मीद है की यह मदद करेगा!

संपादित करें: आपके संपादन के जवाब में, ऑब्जेक्ट गुण उसी तरह काम करना चाहिए।

var person = {
    name: "John",
    age: 28,
    sex: "male"
};

alert(person.name); // "John"
alert(person.fakeVariable); // undefined

42
अगर (कुछ == अपरिभाषित) बेहतर लिखा जाता है जैसे कि (कुछ === अपरिभाषित)
सेबेस्टियन रिताऊ

59
यह ध्यान दिया जाना चाहिए कि यह पूरी तरह से सुरक्षित नहीं है। undefinedकेवल एक चर है जिसे उपयोगकर्ता द्वारा फिर से असाइन किया जा सकता है: लेखन undefined = 'a';आपके कोड को अब वह नहीं करेगा जो आपको लगता है कि यह करता है। उपयोग करना typeofबेहतर है और यह चर (केवल गुण नहीं) के लिए भी काम करता है जिसे घोषित नहीं किया गया है।
गाबे मुथरत

7
अगर कुछ अपरिभाषित वैश्विक चर है, (कुछ == अपरिभाषित) जावास्क्रिप्ट त्रुटि लाता है।
मॉर्गन चेंग

8
इसके साथ समस्या यह है कि अगर var a = null है तो a == अपरिभाषित सत्य का मूल्यांकन करता है, भले ही a सबसे निश्चित रूप से परिभाषित हो।
एंड्रयू

6
"एलोकस जावास्क्रिप्ट" टिप्पणी की यह व्याख्या पिछड़ी हुई है । यदि आप वास्तव में अपरिभाषित की जांच करना चाहते हैं, तो सुझाया गया कोड काम नहीं करेगा (यह परिभाषित की गई स्थिति का भी पता लगाएगा लेकिन अभी तक कोई मूल्य नहीं लिया गया है [ienull]) एक अशक्त मान। सुझाया गया कोड "यदि (कुछ == अपरिभाषित) ..." अपरिभाषित और अशक्त (कोई मूल्य निर्धारित) दोनों के लिए जांच नहीं करता है , तो इसका अर्थ है "अगर (कुछ अपरिभाषित है) या (कुछ अशक्त है) ..." क्या लेखक कह रहा है अक्सर क्या आपको लगता है कि है वास्तव में चाहते हैं के लिए जाँच करने के लिए है दोनों अपरिभाषित और अशक्त।
चक कोलारस

125

इसका क्या अर्थ है: "अपरिभाषित वस्तु संपत्ति" ?

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

var o = { a: undefined }

है o.aअपरिभाषित? हाँ! इसका मूल्य अपरिभाषित है। है o.bअपरिभाषित? ज़रूर! कोई संपत्ति नहीं है 'बी' बिल्कुल! ठीक है, अब देखें कि दोनों स्थितियों में अलग-अलग दृष्टिकोण कैसे व्यवहार करते हैं:

typeof o.a == 'undefined' // true
typeof o.b == 'undefined' // true
o.a === undefined // true
o.b === undefined // true
'a' in o // true
'b' in o // false

हम स्पष्ट रूप से देख सकते हैं typeof obj.prop == 'undefined'और obj.prop === undefinedसमान हैं, और वे उन विभिन्न स्थितियों में अंतर नहीं करते हैं। और 'prop' in objउस स्थिति का पता लगा सकता है जब किसी संपत्ति को बिल्कुल भी परिभाषित नहीं किया गया है और संपत्ति के मूल्य पर ध्यान नहीं देता है जो अपरिभाषित हो सकता है।

इसलिए क्या करना है?

1) आप जानना चाहते हैं कि क्या कोई संपत्ति पहले या दूसरे अर्थ (सबसे विशिष्ट स्थिति) द्वारा अपरिभाषित है।

obj.prop === undefined // IMHO, see "final fight" below

2) आप यह जानना चाहते हैं कि क्या वस्तु में कुछ संपत्ति है और उसके मूल्य की परवाह नहीं करते हैं।

'prop' in obj

टिप्पणियाँ:

  • आप एक ही समय में एक वस्तु और उसकी संपत्ति की जांच नहीं कर सकते। उदाहरण के लिए, यदि x को परिभाषित नहीं किया जाता है तो यह x.a === undefinedया यह typeof x.a == 'undefined'बढ़ ReferenceError: x is not definedजाता है।
  • चर undefinedएक वैश्विक चर है (इसलिए वास्तव में यह window.undefinedब्राउज़रों में है)। ईसीएमएस्क्रिप्ट 1 संस्करण के बाद से इसका समर्थन किया गया है और ईसीएमएस्क्रिप्ट 5 के बाद से इसे केवल पढ़ा जाता है । इसलिए आधुनिक ब्राउज़रों में इसे सही रूप में परिभाषित नहीं किया जा सकता है क्योंकि कई लेखक हमें डराने के लिए प्यार करते हैं, लेकिन यह अभी भी पुराने ब्राउज़रों के लिए सच है।

अंतिम लड़ाई: obj.prop === undefinedबनामtypeof obj.prop == 'undefined'

के प्लस obj.prop === undefined:

  • यह थोड़ा छोटा है और थोड़ा सुंदर दिखता है
  • यदि आपने गलत वर्तनी दी है, तो जावास्क्रिप्ट इंजन आपको एक त्रुटि देगा undefined

का उपयोग obj.prop === undefined:

  • undefined पुराने ब्राउज़रों में ओवरराइड किया जा सकता है

के प्लस typeof obj.prop == 'undefined':

  • यह वास्तव में सार्वभौमिक है! यह नए और पुराने ब्राउज़र में काम करता है।

का उपयोग typeof obj.prop == 'undefined':

  • 'undefned'( गलत वर्तनी ) यहाँ केवल एक स्ट्रिंग स्थिरांक है, इसलिए यदि आपने अभी-अभी किया है तो जावास्क्रिप्ट इंजन आपकी मदद नहीं कर सकता है।

अद्यतन (सर्वर-साइड जावास्क्रिप्ट के लिए):

Node.js वैश्विक वैरिएबल का समर्थन करता है undefinedक्योंकि global.undefined(इसे 'वैश्विक' उपसर्ग के बिना भी इस्तेमाल किया जा सकता है)। मैं सर्वर-साइड जावास्क्रिप्ट के अन्य कार्यान्वयन के बारे में नहीं जानता।


@Bergi आपकी टिप्पणी के लिए धन्यवाद। मैंने अपना उत्तर ठीक कर लिया है। अपने बचाव में मैं कह सकता हूं कि वर्तमान में (v.0.10.18 के अनुसार) आधिकारिक Node.js प्रलेखन केundefined सदस्य के रूप में इसके बारे में कुछ नहीं कहता है global। इसके अलावा और न console.log(global);ही वैश्विक के एक सदस्य के रूप में अपरिभाषितfor (var key in global) { ... } नहीं दिखाता है । लेकिन परीक्षण इसके विपरीत दिखाते हैं। 'undefined' in global
कोंस्टेंटिन स्मोलैनिन

4
यह एक्मास्क्रिप्ट युक्ति में अतिरिक्त दस्तावेज की आवश्यकता नहीं है , जो यह भी कहता है कि [[Enumerable]]यह गलत है :-)
बर्गी

5
Minuses of typeof obj.prop == 'undefined'इस संबंध में , इसे लिखने से बचा जा सकता है typeof obj.prop == typeof undefined। यह भी एक बहुत अच्छा समरूपता देता है।
होवडाल

3
@ क्लोवडाल: यह पूरी तरह से व्यर्थ है obj.prop === undefined
Ry-

1
जब हम सवाल शीर्षक से सत्य हैं " का पता लगा रहा एक अपरिभाषित संपत्ति" , नहीं पहले वाक्य में (अलग और बहुत आसान) प्रश्न का सही ( "चेक अगर अपरिभाषित ..."), आप जवाब if ('foo' in o) ... आपका जवाब सही मायने में है पहले सही जवाब यहाँ। बहुत ज्यादा हर कोई बस उस वाक्य का जवाब देता है।
फ्रैंक नॉक

70

मुद्दा तीन मामलों में उबलता है:

  1. वस्तु के पास संपत्ति है और उसका मूल्य नहीं है undefined
  2. वस्तु का गुण होता है और उसका मूल्य होता है undefined
  3. वस्तु के पास संपत्ति नहीं है।

यह हमें कुछ महत्वपूर्ण मानता है:

अपरिभाषित मान और अपरिभाषित मान के साथ परिभाषित सदस्य के बीच अंतर होता है।

लेकिन नाखुशी typeof obj.fooहमें यह नहीं बताती है कि हमारे पास कौन से तीन मामले हैं। हालाँकि हम इसे "foo" in objमामलों को अलग करने के लिए जोड़ सकते हैं ।

                               |  typeof obj.x === 'undefined' | !("x" in obj)
1.                     { x:1 } |  false                        | false
2.    { x : (function(){})() } |  true                         | false
3.                          {} |  true                         | true

यह ध्यान देने योग्य है कि ये परीक्षण nullप्रविष्टियों के लिए भी समान हैं

                               |  typeof obj.x === 'undefined' | !("x" in obj)
                    { x:null } |  false                        | false

मेरा तर्क है कि कुछ मामलों में यह अधिक समझ में आता है (और स्पष्ट है) यह जांचने के लिए कि क्या संपत्ति है, यह जाँचने की तुलना में कि क्या यह अपरिभाषित है, और एकमात्र मामला जहां यह जांच अलग होगी, मामला 2 है, दुर्लभ मामला एक अपरिभाषित मूल्य के साथ वस्तु में एक वास्तविक प्रविष्टि।

उदाहरण के लिए: मैं सिर्फ कोड का एक गुच्छा रिफ्लेक्ट कर रहा हूं जिसमें चेक का एक गुच्छा था कि क्या किसी वस्तु में एक संपत्ति थी।

if( typeof blob.x != 'undefined' ) {  fn(blob.x); }

जो बिना जांच के लिखे जाने पर स्पष्ट नहीं था।

if( "x" in blob ) { fn(blob.x); }

लेकिन जैसा कि उल्लेख किया गया है ये बिल्कुल समान नहीं हैं (लेकिन मेरी जरूरतों के लिए पर्याप्त से अधिक हैं)।


10
ओ माइकल। महान सुझाव, और मुझे लगता है कि यह चीजों को साफ करता है। एक गोटा जो मुझे मिला, हालाँकि, यह प्रयोग करते समय है! ऑपरेटर के साथ "में"। आपको if (!("x" in blob)) {}चारों ओर कोष्ठक के साथ कहना है, क्योंकि! ऑपरेटर में 'इन' से अधिक पूर्वता है। आशा है कि किसी की मदद करता है।
साइमन ईस्ट

क्षमा करें, माइकल, लेकिन यह मूल प्रश्न के प्रकाश में गलत है, या कम से कम भ्रामक है। 'इन' यह जांचने का एक पर्याप्त तरीका नहीं है कि क्या कोई वस्तु संपत्ति अपरिभाषित है। प्रमाण के लिए, कृपया इस फिडेल को देखें: jsfiddle.net/CsLKJ/4
tex

2
उन दो कोड भागों एक अलग बात करते हैं! द्वारा दिए गए विचार और वस्तु a = {b: undefined}; तो typeof a.b === typeof a.c === 'undefined'लेकिन 'b' in aऔर !('c' in a)
14

3
+1। ओपी यह स्पष्ट नहीं करता है कि क्या संपत्ति मौजूद है और इसका मूल्य अपरिभाषित है , या क्या संपत्ति स्वयं अपरिभाषित है (अर्थात मौजूद नहीं है)।
रॉब

मैं आपकी पहली तालिका में बिंदु (2.) को बदलने का सुझाव दूंगा { x : undefined }या कम से कम इसे दूसरे विकल्प के रूप में जोड़ दूंगा (2.) तालिका में - मुझे उस बिंदु का एहसास करने के लिए एक पल के लिए सोचना था (2.) का मूल्यांकन undefined(हालांकि आप उल्लेख करते हैं कि बाद में)।
मुशाहो

46
if ( typeof( something ) == "undefined") 

यह मेरे लिए काम किया, जबकि दूसरों ने नहीं किया।


47
parens अनावश्यक हैं क्योंकि
टाइपोफ़

12
लेकिन वे यह स्पष्ट करते हैं कि क्या जाँच की जा रही है। अन्यथा इसे पढ़ा जा सकता है typeof (something == "undefined")
अभि बेकर्ट

यदि आपको कोष्ठकों की आवश्यकता है, तो आपको JS में ऑपरेटर पूर्वता सीखना चाहिए: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Ian

11
कोष्ठक सटीक रूप से उपयोगी हैं क्योंकि आपको जेएस में ऑपरेटर की पूर्वता जानने की आवश्यकता नहीं है, और न ही आपको यह अनुमान लगाने की आवश्यकता है कि जेएस में भविष्य के रखरखाव प्रोग्रामर को ऑपरेटर की पूर्ववर्तीता सीखने की आवश्यकता होगी या नहीं।
डेववली

27
कोष्ठक चीजों को स्पष्ट करने के लिए उपयोगी होते हैं। लेकिन इस मामले में वे बस ऑपरेटर को एक फ़ंक्शन की तरह बनाते हैं। इसमें कोई संदेह नहीं है कि यह प्रोग्रामर के इरादे को स्पष्ट करता है। लेकिन अगर आप ऑपरेटर पूर्वता के बारे में अनिश्चित हैं तो आपको इसे इस तरह लिखना चाहिए (typeof something) === "undefined"
रॉबर्ट

42

मुझे यकीन नहीं है कि इसके ===साथ उपयोग करने का मूल कहां typeofसे आया है, और एक सम्मेलन के रूप में मैं इसे कई पुस्तकालयों में उपयोग करते हुए देखता हूं, लेकिन टाइपोऑपर ऑपरेटर एक स्ट्रिंग शाब्दिक रिटर्न देता है, और हम जानते हैं कि फ्रंट अप, इसलिए आप भी टाइप करना चाहते हैं इसे भी जांचें?

typeof x;                      // some string literal "string", "object", "undefined"
if (typeof x === "string") {   // === is redundant because we already know typeof returns a string literal
if (typeof x == "string") {    // sufficient

महान बिंदु एरिक। क्या जाँच प्रकार से भी कोई प्रदर्शन हिट है?
साइमन ईस्ट

5
@ साइमन: काफी विपरीत - कोई भी '===' मामले में जबरदस्ती से बचने से मामूली प्रदर्शन की उम्मीद कर सकता है। त्वरित और गंदे परीक्षण से पता चला है कि '===' FF5.0.1 के तहत '==' की तुलना में 5% तेज है
एंटनी हैचकिंस

5
अधिक गहन परीक्षण से पता चला है कि एफएफ, आईई और क्रोम '==' के तहत '===' (5-10%) की तुलना में कम या ज्यादा तेज है और ओपेरा को इससे कोई फर्क नहीं पड़ता है: jsperf.com/triple- बराबर-बनाम-दो बार-बराबर / 6
एंटनी हैचकिंस

3
का प्रयोग ==अभी भी आवश्यकता है कम से कम एक प्रकार की जांच - दुभाषिया उनके प्रकार पहले जानने के बिना दो ऑपरेंड तुलना नहीं कर सकते।
अलनीतक

7
==की तुलना में एक कम चरित्र है ===:)
svidgen

25

संबंधित प्रश्न से मेरे उत्तर को क्रॉसपोस्ट करना जावास्क्रिप्ट में "अपरिभाषित" की जांच कैसे करें?

इस प्रश्न के लिए, के साथ परीक्षण मामलों को देखें someObject.<whatever>


विभिन्न उत्तरों के परिणामों को दर्शाने वाले कुछ परिदृश्य: http://jsfiddle.net/drzaus/UVjM4/

(ध्यान दें कि परीक्षण के varलिए उपयोग inकिए जाने पर एक अलग-अलग आवरण में फर्क पड़ता है)

संदर्भ के लिए कोड:

(function(undefined) {
    var definedButNotInitialized;
    definedAndInitialized = 3;
    someObject = {
        firstProp: "1"
        , secondProp: false
        // , undefinedProp not defined
    }
    // var notDefined;

    var tests = [
        'definedButNotInitialized in window',
        'definedAndInitialized in window',
        'someObject.firstProp in window',
        'someObject.secondProp in window',
        'someObject.undefinedProp in window',
        'notDefined in window',

        '"definedButNotInitialized" in window',
        '"definedAndInitialized" in window',
        '"someObject.firstProp" in window',
        '"someObject.secondProp" in window',
        '"someObject.undefinedProp" in window',
        '"notDefined" in window',

        'typeof definedButNotInitialized == "undefined"',
        'typeof definedButNotInitialized === typeof undefined',
        'definedButNotInitialized === undefined',
        '! definedButNotInitialized',
        '!! definedButNotInitialized',

        'typeof definedAndInitialized == "undefined"',
        'typeof definedAndInitialized === typeof undefined',
        'definedAndInitialized === undefined',
        '! definedAndInitialized',
        '!! definedAndInitialized',

        'typeof someObject.firstProp == "undefined"',
        'typeof someObject.firstProp === typeof undefined',
        'someObject.firstProp === undefined',
        '! someObject.firstProp',
        '!! someObject.firstProp',

        'typeof someObject.secondProp == "undefined"',
        'typeof someObject.secondProp === typeof undefined',
        'someObject.secondProp === undefined',
        '! someObject.secondProp',
        '!! someObject.secondProp',

        'typeof someObject.undefinedProp == "undefined"',
        'typeof someObject.undefinedProp === typeof undefined',
        'someObject.undefinedProp === undefined',
        '! someObject.undefinedProp',
        '!! someObject.undefinedProp',

        'typeof notDefined == "undefined"',
        'typeof notDefined === typeof undefined',
        'notDefined === undefined',
        '! notDefined',
        '!! notDefined'
    ];

    var output = document.getElementById('results');
    var result = '';
    for(var t in tests) {
        if( !tests.hasOwnProperty(t) ) continue; // bleh

        try {
            result = eval(tests[t]);
        } catch(ex) {
            result = 'Exception--' + ex;
        }
        console.log(tests[t], result);
        output.innerHTML += "\n" + tests[t] + ": " + result;
    }
})();

और परिणाम:

definedButNotInitialized in window: true
definedAndInitialized in window: false
someObject.firstProp in window: false
someObject.secondProp in window: false
someObject.undefinedProp in window: true
notDefined in window: Exception--ReferenceError: notDefined is not defined
"definedButNotInitialized" in window: false
"definedAndInitialized" in window: true
"someObject.firstProp" in window: false
"someObject.secondProp" in window: false
"someObject.undefinedProp" in window: false
"notDefined" in window: false
typeof definedButNotInitialized == "undefined": true
typeof definedButNotInitialized === typeof undefined: true
definedButNotInitialized === undefined: true
! definedButNotInitialized: true
!! definedButNotInitialized: false
typeof definedAndInitialized == "undefined": false
typeof definedAndInitialized === typeof undefined: false
definedAndInitialized === undefined: false
! definedAndInitialized: false
!! definedAndInitialized: true
typeof someObject.firstProp == "undefined": false
typeof someObject.firstProp === typeof undefined: false
someObject.firstProp === undefined: false
! someObject.firstProp: false
!! someObject.firstProp: true
typeof someObject.secondProp == "undefined": false
typeof someObject.secondProp === typeof undefined: false
someObject.secondProp === undefined: false
! someObject.secondProp: true
!! someObject.secondProp: false
typeof someObject.undefinedProp == "undefined": true
typeof someObject.undefinedProp === typeof undefined: true
someObject.undefinedProp === undefined: true
! someObject.undefinedProp: true
!! someObject.undefinedProp: false
typeof notDefined == "undefined": true
typeof notDefined === typeof undefined: true
notDefined === undefined: Exception--ReferenceError: notDefined is not defined
! notDefined: Exception--ReferenceError: notDefined is not defined
!! notDefined: Exception--ReferenceError: notDefined is not defined

21

यदि तुम करो

if (myvar == undefined )
{ 
    alert('var does not exists or is not initialized');
}

जब चर myvarमौजूद नहीं होगा तो यह विफल हो जाएगा , क्योंकि myvar परिभाषित नहीं है, इसलिए स्क्रिप्ट टूट गई है और परीक्षण का कोई प्रभाव नहीं है।

क्योंकि विंडो ऑब्जेक्ट में एक फ़ंक्शन के बाहर एक वैश्विक गुंजाइश (डिफ़ॉल्ट ऑब्जेक्ट) होती है, विंडो ऑब्जेक्ट के लिए एक घोषणा 'संलग्न' होगी।

उदाहरण के लिए:

var myvar = 'test';

वैश्विक चर myvar खिड़की के रूप में ही है ।myvar या खिड़की ['myvar']

वैश्विक चर मौजूद होने पर परीक्षण करने के लिए त्रुटियों से बचने के लिए, आप बेहतर उपयोग करते हैं:

if(window.myvar == undefined )
{ 
    alert('var does not exists or is not initialized');
}

यदि कोई चर वास्तव में मौजूद है, तो यह सवाल मायने नहीं रखता, इसका मूल्य गलत है। अन्यथा, यह अपरिभाषित के साथ चर को शुरू करने के लिए मूर्खतापूर्ण है, और यह बेहतर है कि मूल्य को प्रारंभिक करने के लिए गलत का उपयोग करें। जब आप जानते हैं कि आपके द्वारा घोषित किए गए सभी चर झूठी के साथ आरंभ किए गए हैं, तो आप बस इसके प्रकार की जांच कर सकते हैं या !window.myvarयह जांचने के लिए भरोसा कर सकते हैं कि क्या इसका उचित / वैध मूल्य है। इसलिए जब चर तो निर्धारित नहीं है !window.myvarके लिए एक ही है myvar = undefinedया myvar = falseया myvar = 0

जब आप किसी विशिष्ट प्रकार की अपेक्षा करते हैं, तो चर के प्रकार का परीक्षण करें। बेहतर स्थिति में परीक्षण करने के लिए आप बेहतर काम करते हैं:

if( !window.myvar || typeof window.myvar != 'string' )
{
    alert('var does not exists or is not type of string');
}

जब पहली और सरल स्थिति सच होती है, तो दुभाषिया अगले परीक्षणों को छोड़ देता है।

चर का उदाहरण / वस्तु का उपयोग करना हमेशा बेहतर होता है ताकि यह जांचा जा सके कि उसे वैध मूल्य मिला है या नहीं। यह अधिक स्थिर है और प्रोग्रामिंग का एक बेहतर तरीका है।

(Y)


19

मैंने नहीं देखा (आशा है कि मुझे यह याद नहीं है) किसी ने संपत्ति से पहले वस्तु की जांच की। तो, यह सबसे छोटा और सबसे प्रभावी है (हालांकि जरूरी नहीं कि सबसे स्पष्ट):

if (obj && obj.prop) {
  // Do something;
}

यदि obj या obj.prop अपरिभाषित, अशक्त, या "मिथ्या" है, तो यदि कथन कोड ब्लॉक को निष्पादित नहीं करेगा। यह आमतौर पर अधिकांश कोड ब्लॉक स्टेटमेंट (जावास्क्रिप्ट में) में वांछित व्यवहार है।


2
यदि आप जानना चाहते हैं कि यह क्यों काम करता है: जावास्क्रिप्ट: लॉजिकल ऑपरेटर्स और
सत्य

अगर आप किसी वैरिएबल को प्रॉपर्टी असाइन करना चाहते हैं, अगर यह परिभाषित नहीं है, तो शून्य नहीं है और न ही गलत है, अन्यथा कुछ डिफ़ॉल्ट मान का उपयोग करें, आप उपयोग कर सकते हैं: var x = obj && obj.prop || 'default';
Stijn de Witt

मेरा मानना ​​है कि प्रश्न स्पष्ट रूप से अपरिभाषित के खिलाफ जाँच के लिए है। जेएस के सभी झूठे मूल्यों के खिलाफ आपकी स्थिति की जाँच करें।
NikoKyriakid

15

लेख में नाले के रसातल और अपरिभाषित जावास्क्रिप्ट में मैंने पढ़ा कि अंडरस्कोर।जैसे फ्रेमवर्क इस फ़ंक्शन का उपयोग करते हैं:

function isUndefined(obj){
    return obj === void 0;
}

3
void 0लेखन का सिर्फ एक छोटा तरीका है undefined(क्योंकि जो किसी भी अभिव्यक्ति के बाद शून्य है), यह 3 वर्णक बचाता है। यह भी कर सकता है var a; return obj === a;, लेकिन यह एक और चरित्र है। :-)
रॉब

2
voidएक आरक्षित शब्द है, जबकि डिफ़ॉल्ट रूप से बराबर undefinedनहीं है , जबकि आप उदाहरण के लिए एक मान प्रदान कर सकते हैं । undefinedvoid 0undefinedundefined = 1234
ब्रायन एम। हंट

isUndefined(obj): 16 वर्ण। obj === void 0: 14 वर्ण। 'बहुत कहा।
स्टिजन डे विट

14

बस कुछ भी जावास्क्रिप्ट में परिभाषित नहीं है, अपरिभाषित है , इससे कोई फर्क नहीं पड़ता कि यह एक वस्तु / एरे के अंदर की संपत्ति है या सिर्फ एक साधारण पैराग्राफ के रूप में ...

जावास्क्रिप्ट ने typeofइसे अपरिभाषित चर का पता लगाना बहुत आसान बना दिया है।

बस जाँच करें कि क्या typeof whatever === 'undefined'और यह एक बूलियन वापस कर देगा।

कि isUndefined()AngularJs v.1x में प्रसिद्ध समारोह कैसे लिखा गया है:

function isUndefined(value) {return typeof value === 'undefined';} 

तो जैसा कि आप देख रहे हैं कि फ़ंक्शन को एक मान प्राप्त होता है, यदि उस मान को परिभाषित किया जाता है, तो यह वापस आ जाएगा false, अन्यथा अपरिभाषित मानों के लिए, वापस लौटें true

तो चलिए एक नज़र डालते हैं कि जब हम मानों को पास करते हैं तो परिणाम क्या होते हैं, जिसमें नीचे दिए गए ऑब्जेक्ट गुण भी शामिल हैं, यह हमारे पास मौजूद चर की सूची है:

var stackoverflow = {};
stackoverflow.javascipt = 'javascript';
var today;
var self = this;
var num = 8;
var list = [1, 2, 3, 4, 5];
var y = null;

और हम उन्हें नीचे की तरह देखते हैं, आप उनके सामने परिणाम को एक टिप्पणी के रूप में देख सकते हैं:

isUndefined(stackoverflow); //false
isUndefined(stackoverflow.javascipt); //false
isUndefined(today); //true
isUndefined(self); //false
isUndefined(num); //false
isUndefined(list); //false
isUndefined(y); //false
isUndefined(stackoverflow.java); //true
isUndefined(stackoverflow.php); //true
isUndefined(stackoverflow && stackoverflow.css); //true

जैसा कि आप देखते हैं कि हम अपने कोड में इस तरह से कुछ का उपयोग करके देख सकते हैं, जैसा कि आप typeofअपने कोड में उपयोग कर सकते हैं , लेकिन यदि आप इसे बार-बार उपयोग कर रहे हैं, तो कोणीय नमूने जैसा एक फ़ंक्शन बनाएं जिसे मैं साझा करता हूं और पुन: उपयोग कर रहा हूं निम्नलिखित डीआरवाई कोड पैटर्न।

इसके अलावा एक और बात, एक वास्तविक एप्लिकेशन में किसी ऑब्जेक्ट पर संपत्ति की जांच के लिए जिसे आप सुनिश्चित नहीं करते हैं कि ऑब्जेक्ट मौजूद है या नहीं, जांचें कि ऑब्जेक्ट पहले मौजूद है या नहीं।

यदि आप किसी ऑब्जेक्ट पर एक संपत्ति की जांच करते हैं और ऑब्जेक्ट मौजूद नहीं है, तो एक त्रुटि को फेंक देगा और पूरे एप्लिकेशन को बंद कर देगा।

isUndefined(x.css);
VM808:2 Uncaught ReferenceError: x is not defined(…)

इतना आसान आप नीचे दिए गए विवरण की तरह से लपेट सकते हैं:

if(typeof x !== 'undefined') {
  //do something
}

जो भी कोणीय 1.x में isDefined के बराबर है ...

function isDefined(value) {return typeof value !== 'undefined';}

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

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

सख्त समानता और अपरिभाषित
आप एक चर का मान है या नहीं यह निर्धारित करने के लिए अपरिभाषित और सख्त समानता और असमानता ऑपरेटरों का उपयोग कर सकते हैं। निम्नलिखित कोड में, चर x को परिभाषित नहीं किया गया है, और यदि कथन सत्य का मूल्यांकन करता है।

var x;
if (x === undefined) {
   // these statements execute
}
else {
   // these statements do not execute
}

नोट: मानक समानता ऑपरेटर के बजाय सख्त समानता ऑपरेटर का उपयोग यहां किया जाना चाहिए, क्योंकि x == अपरिभाषित यह भी जांचता है कि क्या x शून्य है, जबकि सख्त समानता नहीं है। अशक्त अपरिभाषित के बराबर नहीं है। विवरण के लिए तुलना ऑपरेटर देखें।


टाइपऑफ़ ऑपरेटर और अपरिभाषित
वैकल्पिक रूप से, टाइपोफ़ का उपयोग किया जा सकता है:

var x;
if (typeof x === 'undefined') {
   // these statements execute
}

टाइपोफ़ का उपयोग करने का एक कारण यह है कि यदि चर घोषित नहीं किया गया है तो यह एक त्रुटि नहीं है।

// x has not been declared before
if (typeof x === 'undefined') { // evaluates to true without errors
   // these statements execute
}

if (x === undefined) { // throws a ReferenceError

}

हालांकि, इस तरह की तकनीक से बचा जाना चाहिए। जावास्क्रिप्ट एक स्टेटिक रूप से स्कोप्ड भाषा है, इसलिए यह जानने के लिए कि एक चर घोषित किया गया है या नहीं, यह देखकर कि क्या इसे एनक्लोजिंग संदर्भ में घोषित किया गया है, पढ़ा जा सकता है। एकमात्र अपवाद वैश्विक गुंजाइश है, लेकिन वैश्विक गुंजाइश वैश्विक ऑब्जेक्ट के लिए बाध्य है, इसलिए वैश्विक संदर्भ में एक चर के अस्तित्व की जांच वैश्विक ऑब्जेक्ट पर एक संपत्ति के अस्तित्व की जांच करके (ऑपरेटर का उपयोग करके) की जा सकती है, उदाहरण के लिए)।


शून्य ऑपरेटर और अपरिभाषित

शून्य ऑपरेटर एक तीसरा विकल्प है।

var x;
if (x === void 0) {
   // these statements execute
}

// y has not been declared before
if (y === void 0) {
   // throws a ReferenceError (in contrast to `typeof`)
}

और> यहाँ


13

' if (window.x) {} ' त्रुटि सुरक्षित है

सबसे अधिक संभावना है कि आप चाहते हैं if (window.x)। यह जाँच सुरक्षित है भले ही x घोषित नहीं किया गया हो ( var x;) - ब्राउज़र कोई त्रुटि नहीं देता है।

उदाहरण: मैं जानना चाहता हूं कि क्या मेरा ब्राउज़र इतिहास एपीआई का समर्थन करता है

if (window.history) {
    history.call_some_function();
}

यह कैसे काम करता है:

विंडो एक ऐसी वस्तु है जो सभी वैश्विक चर को अपने सदस्यों के रूप में रखती है, और गैर-मौजूदा सदस्य तक पहुंचने की कोशिश करना कानूनी है। यदि एक्स घोषित नहीं किया गया है या सेट नहीं किया गया तो window.xरिटर्न अपरिभाषितअपरिभाषित पर ले जाया जाता झूठी जब यदि () यह मूल्यांकन करता है।


लेकिन क्या होगा अगर आप नोड में चलते हैं? typeof history != 'undefined'वास्तव में दोनों प्रणालियों में काम करता है।
स्टिजन डे विट

13

इसके माध्यम से पढ़ना, मुझे आश्चर्य है कि मैंने यह नहीं देखा। मुझे कई एल्गोरिदम मिले हैं जो इसके लिए काम करेंगे।

कभी परिभाषित नहीं

यदि किसी वस्तु के मूल्य को कभी परिभाषित नहीं किया गया था, trueतो यह वापस लौटने से रोक देगा यदि इसे nullया के रूप में परिभाषित किया गया हो undefined। यह मददगार है यदि आप चाहते हैं कि सही मानों को सेट किए गए मानों के लिए लौटाया जाएundefined

if(obj.prop === void 0) console.log("The value has never been defined");

अपरिभाषित के रूप में परिभाषित या कभी परिभाषित नहीं

यदि आप चाहते हैं कि इसका परिणाम trueमान के साथ परिभाषित मूल्यों के रूप में हो undefined, या कभी भी परिभाषित न हो, तो आप बस उपयोग कर सकते हैं=== undefined

if(obj.prop === undefined) console.log("The value is defined as undefined, or never defined");

एक मिथ्या मान के रूप में परिभाषित, अपरिभाषित, अशक्त या कभी परिभाषित नहीं।

आमतौर पर, लोगों ने मुझसे एक एल्गोरिथ्म के लिए यह पता लगाने के लिए कहा है कि क्या कोई मूल्य गलत है undefined, या null। निम्नलिखित कार्य करता है।

if(obj.prop == false || obj.prop === null || obj.prop === undefined) {
    console.log("The value is falsy, null, or undefined");
}

4
मुझे लगता है कि आप अंतिम उदाहरण की जगहif (!obj.prop)
Stijn de Witt

@StijndeWitt, आप कर सकते हैं, जब मैंने यह लिखा था, तो मैं बहुत अनुभवहीन था, और मेरी अंग्रेजी भी उतनी ही खराब रही है, फिर भी, जवाब में कुछ भी गलत नहीं है
ट्रैविस

3
var obj = {foo: undefined}; obj.foo === void 0-> true। यह कैसे "कभी नहीं के रूप में परिभाषित किया गया है undefined"? ये गलत है।
पैट्रिक रॉबर्ट्स

@PatrickRoberts आप सही कह रहे हैं। जब मैंने फरवरी 2015 (ईएस 6 से पहले) में यह उत्तर लिखा था तो मैंने जो पहला विकल्प बताया था, वह वास्तव में काम कर रहा था, लेकिन यह अब पुराना हो चुका है।
ट्रैविस


10

के साथ तुलना करें void 0, मरोड़ के लिए।

if (foo !== void 0)

यह क्रिया के रूप में नहीं है if (typeof foo !== 'undefined')


3
लेकिन fooअघोषित होने पर यह एक रेफरेंस फेंक देगा ।
daniel1426

1
@ daniel1426: तो अगर आपके कोड में कोई त्रुटि है, तो आप इसे ठीक करने के बजाय इसे छिपाना चाहते हैं? एक महान दृष्टिकोण नहीं, आईएमओ।

यह त्रुटियों को छिपाने के लिए उपयोग नहीं किया जाता है। यह पॉलीफिल को परिभाषित करने के लिए पर्यावरण के गुणों का पता लगाने का सामान्य तरीका है। उदाहरण के लिए: यदि (टाइप करें वादा === 'अपरिभाषित') {/ * परिभाषित वादा * /}
अंतर

10

समाधान गलत है। जावास्क्रिप्ट में,

null == undefined

सच लौटेगा, क्योंकि वे दोनों एक बूलियन के लिए "कास्ट" हैं और झूठे हैं। सही तरीके से जांच होगी

if (something === undefined)

जो पहचान ऑपरेटर है ...


3
स्पष्ट होने के लिए, ===प्रकार समानता है + (आदिम समानता। वस्तु पहचान), जहां आदिम में तार शामिल हैं। मुझे लगता है कि 'abab'.slice(0,2) === 'abab'.slice(2)अगर कोई पहचानकर्ता के ===रूप में मानता है तो ज्यादातर लोग अनजाने में विचार करते हैं।
क्लैक

1
गलत। यदि चर नहीं बनाया गया है, तो यह एक त्रुटि फेंकता है। मतदान नहीं होना चाहिए। इसके बजाय टाइपोफ का उपयोग करें।
साइमन ईस्ट

10

आप निम्न कोड का उपयोग करके पथ के साथ सभी को अपरिभाषित कर सकते हैं।

 function getAllUndefined(object) {

        function convertPath(arr, key) {
            var path = "";
            for (var i = 1; i < arr.length; i++) {

                path += arr[i] + "->";
            }
            path += key;
            return path;
        }


        var stack = [];
        var saveUndefined= [];
        function getUndefiend(obj, key) {

            var t = typeof obj;
            switch (t) {
                case "object":
                    if (t === null) {
                        return false;
                    }
                    break;
                case "string":
                case "number":
                case "boolean":
                case "null":
                    return false;
                default:
                    return true;
            }
            stack.push(key);
            for (k in obj) {
                if (obj.hasOwnProperty(k)) {
                    v = getUndefiend(obj[k], k);
                    if (v) {
                        saveUndefined.push(convertPath(stack, k));
                    }
                }
            }
            stack.pop();

        }

        getUndefiend({
            "": object
        }, "");
        return saveUndefined;
    }

jsFiddle लिंक


हालांकि यह आपके कोड की वैधता को प्रभावित नहीं करेगा, आपको एक टाइपो मिल गया है: getUndefiendहोना चाहिए getUndefined
icktoofay

8

यहाँ मेरी स्थिति है:

मैं एक रिस्ट कॉल के परिणाम का उपयोग कर रहा हूं। परिणाम JSON से जावास्क्रिप्ट ऑब्जेक्ट पर पार्स किया जाना चाहिए।

एक त्रुटि है जिसका मुझे बचाव करने की आवश्यकता है। यदि शेष कॉल के लिए args गलत था, जहाँ तक उपयोगकर्ता args को गलत बताता है, तो शेष कॉल मूल रूप से खाली आता है।

इस पोस्ट का उपयोग करते हुए मुझे इससे बचाव करने में मदद करने के लिए, मैंने यह कोशिश की।

if( typeof restResult.data[0] === "undefined" ) { throw  "Some error"; }

मेरी स्थिति के लिए, अगर restResult.data [0] === "ऑब्जेक्ट", तो मैं सुरक्षित रूप से बाकी सदस्यों का निरीक्षण करना शुरू कर सकता हूं। यदि अपरिभाषित है तो त्रुटि को ऊपर के रूप में फेंक दें।

मैं यह कह रहा हूं कि मेरी स्थिति के लिए, इस पोस्ट में ऊपर दिए गए सभी सुझाव काम नहीं आए। मैं यह नहीं कह रहा कि मैं सही हूं और हर कोई गलत है। मैं एक जावास्क्रिप्ट मास्टर बिल्कुल नहीं हूँ, लेकिन उम्मीद है कि यह किसी की मदद करेगा।


आपका typeofगार्ड वास्तव में किसी भी चीज़ की रक्षा नहीं करता है जो एक सीधी तुलना नहीं कर सकता है। यदि restResultअनिर्धारित या अघोषित है, तो यह अभी भी फेंक देगा।

आपके मामले में आप अधिक आसानी से देख सकते हैं कि क्या सरणी खाली है:if(!restResult.data.length) { throw "Some error"; }
हेडबैंक

8

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

var a = obj.prop || defaultValue;

यदि आपके पास कोई फ़ंक्शन है, तो यह उपयुक्त है, जो अतिरिक्त कॉन्फ़िगरेशन गुण प्राप्त करता है:

var yourFunction = function(config){

   this.config = config || {};
   this.yourConfigValue = config.yourConfigValue || 1;
   console.log(this.yourConfigValue);

}

अब अमल कर रहे हैं

yourFunction({yourConfigValue:2});
//=> 2

yourFunction();
//=> 1

yourFunction({otherProperty:5});
//=> 1

7

सभी उत्तर अपूर्ण हैं। यह जानने का सही तरीका है कि कोई संपत्ति 'अपरिभाषित के रूप में परिभाषित' है:

var hasUndefinedProperty = function hasUndefinedProperty(obj, prop){
  return ((prop in obj) && (typeof obj[prop] == 'undefined')) ;
} ;

उदाहरण:

var a = { b : 1, e : null } ;
a.c = a.d ;

hasUndefinedProperty(a, 'b') ; // false : b is defined as 1
hasUndefinedProperty(a, 'c') ; // true : c is defined as undefined
hasUndefinedProperty(a, 'd') ; // false : d is undefined
hasUndefinedProperty(a, 'e') ; // false : e is defined as null

// And now...
delete a.c ;
hasUndefinedProperty(a, 'c') ; // false : c is undefined

बहुत बुरा है कि यह सही उत्तर है गलत उत्तर में दफन किया गया है _ _ <

तो, जो कोई भी पास से गुजरता है, मैं आपको मुफ्त में अपरिभाषित दूंगा !!

var undefined ; undefined ; // undefined
({}).a ;                    // undefined
[].a ;                      // undefined
''.a ;                      // undefined
(function(){}()) ;          // undefined
void(0) ;                   // undefined
eval() ;                    // undefined
1..a ;                      // undefined
/a/.a ;                     // undefined
(true).a ;                  // undefined

7

टिप्पणियों के माध्यम से जाना, उन लोगों के लिए जो दोनों को जांचना चाहते हैं क्या यह अपरिभाषित है या इसका मूल्य शून्य है:

//Just in JavaScript
var s; // Undefined
if (typeof s == "undefined" || s === null){
    alert('either it is undefined or value is null')
}

यदि आप jQuery लाइब्रेरी का उपयोग कर रहे हैं तो jQuery.isEmptyObject()दोनों मामलों के लिए पर्याप्त होगा,

var s; // Undefined
jQuery.isEmptyObject(s); // Will return true;

s = null; // Defined as null
jQuery.isEmptyObject(s); // Will return true;

//Usage
if (jQuery.isEmptyObject(s)) {
    alert('Either variable:s is undefined or its value is null');
} else {
     alert('variable:s has value ' + s);
}

s = 'something'; // Defined with some value
jQuery.isEmptyObject(s); // Will return false;

jQuery अलग जावास्क्रिप्ट एपीआई के साथ किसी भी क्रॉस-ब्राउज़र संगतता मुद्दों का भी ध्यान रखेगा।
हेनरी हेलीन

7

यदि आप कोणीय का उपयोग कर रहे हैं:

angular.isUndefined(obj)
angular.isUndefined(obj.prop)

Underscore.js:

_.isUndefined(obj) 
_.isUndefined(obj.prop) 

2
मैं 1चर में कैसे जोड़ूँ x? क्या मुझे अंडरस्कोर या jQuery की आवश्यकता है? (आश्चर्यजनक है कि लोग पुस्तकालयों का उपयोग यहां तक ​​कि सबसे प्राथमिक कार्यों जैसे कि typeofचेक के लिए भी करेंगे )
स्टिजन डे विट

6

if (this.variable)अगर यह परिभाषित है तो मैं परीक्षण करने के लिए उपयोग करता हूं । सरल if (variable), ऊपर अनुशंसित , मेरे लिए विफल रहता है। यह पता चलता है कि यह तभी काम करता है जब चर किसी वस्तु का क्षेत्र होता है, obj.someFieldयह जाँचने के लिए कि क्या वह डिक्शनरी में परिभाषित है। लेकिन हम इसका उपयोग कर सकते हैं thisया windowशब्दकोश ऑब्जेक्ट के रूप में किसी भी चर वर्तमान विंडो में एक क्षेत्र है, जैसा कि मैं इसे समझता हूं। इसलिए यहाँ एक परीक्षा है

if (this.abc) alert("defined"); else alert("undefined");

abc = "abc";
if (this.abc) alert("defined"); else alert("undefined");

यह पहली बार पता लगाता है कि चर abcअपरिभाषित है और इसे आरंभीकरण के बाद परिभाषित किया गया है।


5

मैं अजीब जवाब की उम्मीद करने वालों के लिए यहां तीन तरीके प्रदान करता हूं:

function isUndefined1(val) {
    try {
        val.a;
    } catch (e) {
        return /undefined/.test(e.message);
    }
    return false;
}
function isUndefined2(val) {
    return !val && val+'' === 'undefined';
}
function isUndefined3(val) {
    const defaultVal={};
    return ((input=defaultVal)=>input===defaultVal)(val);
}
function test(func){
    console.group(`test start :`+func.name);
    console.log(func(undefined));
    console.log(func(null));
    console.log(func(1));
    console.log(func("1"));
    console.log(func(0));
    console.log(func({}));
    console.log(func(function () { }));
    console.groupEnd();
}
test(isUndefined1);
test(isUndefined2);
test(isUndefined3);

isUndefined1:

इनपुट मान की संपत्ति प्राप्त करने का प्रयास करें, यदि मौजूद है तो त्रुटि संदेश की जांच करें। यदि इनपुट मान अपरिभाषित है, तो त्रुटि संदेश होगा अनपेक्षित टाइप : अपरिभाषित की संपत्ति 'बी' को नहीं पढ़ा जा सकता है

isUndefined2:

तुलना करने के लिए इनपुट मान को स्ट्रिंग में बदलें "undefined" और यह सुनिश्चित करें कि यह नकारात्मक मूल्य है।

isUndefined3:

Js में, वैकल्पिक पैरामीटर तब काम करता है जब इनपुट वैल्यू बिल्कुल होती है undefined


4
function isUnset(inp) {
  return (typeof inp === 'undefined')
}

यदि चर सेट है, और यदि अपरिभाषित है तो सही है।

फिर उपयोग करें:

if (isUnset(var)) {
  // initialize variable here
}

5
नहीं, यह मत करो। यह केवल यह साबित करने के लिए एक बहुत ही सरल परीक्षा लेता है कि आप सार्थक रूप typeofसे एक फ़ंक्शन में परीक्षण लपेट नहीं सकते । कमाल यह कि 4 लोगों ने इसे उखाड़ फेंका। -1।
स्टिजन डे विट

4

मैं आपको undefinedवैरिएबल की सुरक्षा के लिए कुछ ऐसा दिखाना चाहूंगा जिसका उपयोग मैं कर रहा हूं :

Object.defineProperty(window, 'undefined', {});

यह window.undefinedमान बदलने के लिए किसी को भी मना करता है इसलिए उस चर के आधार पर कोड को नष्ट करना। यदि उपयोग किया जाता है "use strict", तो इसके मूल्य को बदलने की कोशिश कर रहा कुछ भी गलती से समाप्त हो जाएगा, अन्यथा इसे चुपचाप अनदेखा कर दिया जाएगा।


4

आप प्रॉक्सी का उपयोग भी कर सकते हैं, यह नेस्टेड कॉल के साथ काम करेगा, लेकिन एक अतिरिक्त चेक की आवश्यकता होगी:

function resolveUnknownProps(obj, resolveKey) {
  const handler = {
    get(target, key) {
      if (
        target[key] !== null &&
        typeof target[key] === 'object'
      ) {
        return resolveUnknownProps(target[key], resolveKey);
      } else if (!target[key]) {
        return resolveUnknownProps({ [resolveKey]: true }, resolveKey);
      }

      return target[key];
    },
  };

  return new Proxy(obj, handler);
}

const user = {}

console.log(resolveUnknownProps(user, 'isUndefined').personalInfo.name.something.else); // { isUndefined: true }

तो आप इसका उपयोग करेंगे जैसे:

const { isUndefined } = resolveUnknownProps(user, 'isUndefined').personalInfo.name.something.else;
if (!isUndefined) {
  // do someting
}

4

लॉश से .js।

var undefined;
function isUndefined(value) {
  return value === undefined;
}

यह एक LOCAL वैरिएबल बनाता है, जिसका नाम undefinedडिफ़ॉल्ट मान के साथ इनिशियलाइज़ किया जाता है - वास्तविक undefined, फिर valueवैरिएबल से तुलना करता है undefined


अपडेट 9/9/2019

मैंने पाया कि लॉश ने इसके कार्यान्वयन को अद्यतन किया। मेरा मुद्दा और कोड देखें

बुलेट-प्रूफ होने के लिए, बस उपयोग करें:

function isUndefined(value) {
  return value === void 0;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.