जावास्क्रिप्ट में एक नहीं परिभाषित चर की जांच कैसे करें


912

मैं यह जाँचना चाहता था कि चर परिभाषित किया गया है या नहीं। उदाहरण के लिए, निम्नलिखित एक नहीं परिभाषित त्रुटि फेंकता है

alert( x );

मैं इस त्रुटि को कैसे पकड़ सकता हूं?



5
ऐसा लगता है कि यह एक ग्रैंडडैडी है: stackoverflow.com/questions/1485840/… stackoverflow.com/questions/2647867/… - महान दाद शायद यह हो सकता है: stackoverflow.com/questions/27509/…
यादृच्छिक

1
यह चिह्नित डुप्लिकेट का डुप्लिकेट नहीं है। परिवर्तनीय संकल्प और ऑब्जेक्ट प्रॉपर्टी रिज़ॉल्यूशन बहुत अलग चीजें हैं। एक बेहतर डुप्लिकेट यह जांचने के लिए है कि जावास्क्रिप्ट में कोई चर मौजूद है या नहीं?
रॉबग नोव

परिवर्तनशील घोषित नहीं होने के कारण आपकी त्रुटि है। अधिकांश उत्तर असाइनमेंट पर केंद्रित होते हैं। अधिक के लिए मेरा जवाब देखें । इसके अतिरिक्त उनमें से कई गलत तरीके से बताते हैं कि जावास्क्रिप्ट में अशक्त और अपरिभाषित वस्तुएं हैं। वे आदिम हैं , वस्तु नहीं ...
JBallin

जवाबों:


1689

जावास्क्रिप्ट में, nullएक वस्तु है। वहाँ चीजें हैं जो मौजूद नहीं है के लिए एक और मूल्य, है undefined। DOM nullलगभग सभी मामलों के लिए वापस लौटता है जहां यह दस्तावेज़ में कुछ संरचना खोजने में विफल रहता है, लेकिन जावास्क्रिप्ट में ही undefinedइसका उपयोग किया जाता है।

दूसरा, नहीं, कोई प्रत्यक्ष समकक्ष नहीं है। यदि आप वास्तव में विशेष रूप से के लिए जाँच करना चाहते हैं null, तो:

if (yourvar === null) // Does not execute if yourvar is `undefined`

यदि आप जाँचना चाहते हैं कि क्या कोई चर मौजूद है, जो केवल try/ के साथ किया जा सकता है catch, क्योंकि typeofएक अघोषित चर का इलाज करेगा और एक चर के undefinedबराबर मूल्य के साथ घोषित किया जाएगा ।

लेकिन, जांच करने के लिए अगर एक चर घोषित किया जाता है और नहीं है undefined:

if (yourvar !== undefined) // Any scope

पहले, typeofसुरक्षित रूप से अपरिभाषित की जांच करने के लिए ऑपरेटर का उपयोग करना आवश्यक था , क्योंकि यह undefinedएक चर की तरह पुन: असाइन करना संभव था । पुराने तरीके से इस तरह देखा:

if (typeof yourvar !== 'undefined') // Any scope

undefinedईसीएमएस्क्रिप्ट 5 में पुन: असाइन किए जाने का मुद्दा तय किया गया था, जिसे 2009 में जारी किया गया था। अब आप सुरक्षित रूप से उपयोग कर सकते हैं ===और बिना उपयोग किए !==परीक्षण कर सकते हैं जैसा कि केवल कुछ समय के लिए पढ़ा गया है।undefinedtypeofundefined

यदि आप यह जानना चाहते हैं कि क्या कोई सदस्य स्वतंत्र है, लेकिन इसकी कीमत क्या है, इसकी परवाह न करें:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

यदि आप जानना चाहते हैं कि क्या एक चर सत्य है :

if (yourvar)

स्रोत


71
अपरिभाषित एक आरक्षित शब्द नहीं है; आप (या किसी और का कोड) "अपरिभाषित = 3" कर सकते हैं और यह आपके दो परीक्षणों को तोड़ देगा।
जेसन एस

6
"यदि आप जानते हैं कि चर मौजूद है, लेकिन यह नहीं जानते कि क्या इसमें कोई मूल्य संग्रहीत है" - हुह ?!
जेसन एस

36
मुझे लगता है कि वह एक ऐसे चर की बात कर रहा है जिसे घोषित नहीं किया गया है। उदाहरण: var foo; // foo मौजूद है, लेकिन इसका कोई मूल्य नहीं है
वैली लॉलेस

3
हम्म ... मैंने सिर्फ "स्रोत" लिंक पर ध्यान दिया: यह पूरी पोस्ट एक मेलिंग सूची से एक प्रत्यक्ष उद्धरण है, और संभवतः इसे और अधिक स्पष्ट करने के लिए संपादित किया जाना चाहिए, क्योंकि मूल लेखक स्पष्ट करने के लिए उपलब्ध नहीं है।
जेसन एस

11
"जावास्क्रिप्ट में नल एक वस्तु है।", यह वास्तव में सच नहीं है, और शायद, इस गलत धारणा का अपराधी typeofऑपरेटर ( typeof null == 'object') है। nullमूल्य एक है आदिम मूल्य , जिनमें से केवल मूल्य है अशक्त प्रकार
CMS

347

वास्तव में परीक्षण करने का एकमात्र तरीका अगर एक चर undefinedनिम्नलिखित करना है। याद रखें, अपरिभाषित जावास्क्रिप्ट में एक वस्तु है।

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}

इस धागे के कुछ अन्य समाधान आपको विश्वास दिलाएंगे कि एक चर अपरिभाषित है भले ही इसे परिभाषित किया गया हो (उदाहरण के लिए NULL या 0 के मान के साथ)।


18
क्योंकि सवाल यह नहीं था कि यहाँ कुछ टाइप नहीं होना चाहिए? == 'अपरिभाषित', सही?
eomeroff

1
वास्तव में, मुझे नहीं लगता कि ऐसा नहीं किया गया है कि कोई भी अनिर्दिष्ट वस्तु है, दस्तावेज की जांच करें पहले डेवलपर.
mozilla.org/en-US/docs/Web/JavaScript/Data_structures

2
एकमात्र परीक्षण जो उत्पादन नहीं करता है ReferenceError
Nostalg.io

2
यह कोड सही है, लेकिन मुझे लगता है कि undefinedयह कहना कि जावास्क्रिप्ट में एक वस्तु गलत सूचना है। क्या यह कथन वैसे भी आपके उत्तर से संबंधित है? यह एक undefinedप्रकार का मान है undefined, जिसे नामित वैश्विक पहचानकर्ता को सौंपा गया है undefined
सिंपलजी

1
अब यह एकमात्र तरीका होने के संदर्भ में गलत है। undefinedES5 के बाद से आसानी से पढ़ा गया है। आप if (x === undefined) {...}इस तरह से शॉर्टहैंड का उपयोग करके या बिना उपयोग किए सुरक्षित रूप से परीक्षण कर सकते हैं if (x === void 0):।
स्टीफन एम इरविंग

66

तकनीकी रूप से, उचित समाधान है (मेरा मानना ​​है):

typeof x === "undefined"

आप कभी-कभी आलसी हो सकते हैं और उपयोग कर सकते हैं

x == null

लेकिन यह दोनों अपरिभाषित चर x, और एक चर x शून्य युक्त अनुमति देता है, सच लौटने के लिए।


1
यदि आप टाइप करते हैं var x;और फिर typeof x;आप "undefined"वैसे ही प्राप्त करेंगे जैसे आपने किया थाtypeof lakjdflkdsjflsj;
मुहम्मद उमर

तो अपरिभाषित लेकिन घोषित चर के लिए जाँच करने का कोई तरीका नहीं है?
मुहम्मद उमर

1
मुझे ऐसा नहीं लगता; मुझे यकीन नहीं है कि आप क्यों करना चाहते हैं।
जेसन एस

ujndefined को apices के बीच नहीं होना चाहिए
LowFieldTheory

आप वानरों से क्या मतलब रखते हैं?
जेसन एस

19

इससे भी आसान और अधिक शॉर्टहैंड संस्करण होगा:

if (!x) {
   //Undefined
}

या

if (typeof x !== "undefined") {
    //Do something since x is defined.
}

26
पहला कोड-टुकड़ा गलत हो सकता है अगर x को फ़ंक्शन कॉल से सेट किया जा रहा है। जैसे x = A (); यदि A कुछ नहीं लौटाता है, तो वह डिफ़ॉल्ट रूप से "अपरिभाषित" वापस आ जाएगा। ए! एक्स करना सही होगा जो तार्किक रूप से सही होगा। हालाँकि, यदि A () 0 देता है तो x x = 0 के रूप में गलत होना चाहिए। हालाँकि JS में; 0 भी सच है।
रजत डेस

दूसरा कोड छोटा किया जा सकता है: यदि ((टाइपोफ़ (XX)) {...} और {...}
एलेजांद्रो सिल्वा

2
@AlejandroSilva देर से जवाब के लिए क्षमा करें। चूंकि टाइपऑफ़ एक स्ट्रिंग देता है, इसलिए यह काम नहीं करेगा, इसलिए यह अपरिभाषित चर के लिए 'अपरिभाषित' लौटाएगा, जो कि TRUE के रूप में मूल्यांकन करेगा इसलिए एक परिभाषित संस्करण के झूठे सकारात्मक के लिए अग्रणी होगा।
दिमित्री फ़ारकोव

5
कृपया पहले स्निपेट से छुटकारा पाएं, यह सिर्फ बुरा है
जुआन मेंडेस

1
अन्य टिप्पणियों ने बताया है कि पहला उदाहरण खराब है, लेकिन स्पष्ट रूप से क्यों नहीं। तो, किसी भी नए कोडर्स के लिए: x का परीक्षण नहीं किया गया है कि क्या x परिभाषित है, लेकिन क्या यह सत्य है। स्ट्रिंग्स, बूलियन ट्रू, और पॉजिटिव नंबर सभी सत्य हैं (और मैं कुछ चीजों को भूल सकता हूं), लेकिन अन्य संभावित मान्य मान जैसे 0, बूलियन गलत और एक खाली स्ट्रिंग सत्य नहीं हैं। पहला उदाहरण विशिष्ट उपयोग के मामलों के लिए काम कर सकता है (उदाहरण के लिए, एक स्ट्रिंग के लिए परीक्षण यदि आप अपरिभाषित के रूप में एक ही इलाज कर सकते हैं), लेकिन कई कारणों से जहां यह नहीं होगा, इसे जांच का डिफ़ॉल्ट तरीका नहीं माना जाना चाहिए।
16:14

16

मैंने अक्सर किया है:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}

9
"==" को "===" बदलने पर विचार करें। यदि आप doSomething (null) को कॉल करते हैं, तो आपको अलर्ट भी मिलेगा। जब तक कि आप क्या चाहते हैं।
जेसन एस

हां। आपको यह तय करना होगा कि आप बराबर या बिल्कुल बराबर चाहते हैं। किसी भी मामले में एक उपयोग हो सकता है।
जो

1
बस इस तरह की जाँच करें-> यदि (टाइपऑफ वैरिएननेम! == 'अपरिभाषित') {अलर्ट (वैरिएन नेम);}
मुहम्मद सादिक

यह बेकार है क्योंकि आप किसी भी तरह एक अपरिभाषित संस्करण को पास करने में सक्षम नहीं होंगे
avalanche1

2
जरूर आप कर सकते हो। बिना किसी तर्क के एक फ़ंक्शन को कॉल करने का प्रयास करें।
जो

3

आप टर्नरी सशर्त-ऑपरेटर का भी उपयोग कर सकते हैं:

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);


क्या होगा अगर var a = false;? आपको यह देखना चाहिए कि यदि a===undefinedइसके बजाय
Iter Ator

1
प्रश्न: एक परिभाषित नहीं चर की जाँच करें ..... यह अपरिभाषित चर है: var x; ऊपर कर एक त्रुटि फेंक देंगे
मुहम्मद उमर

"यदि एक = गलत है, तो यह दिखाएगा" मैं नहीं जानता 'ए' "- यह समस्या है, सवाल यह है कि अगर यह सच है, तो परीक्षण करना है या नहीं। यदि अ को असत्य के रूप में परिभाषित किया गया है, तो अ अपरिभाषित नहीं है। यह उस स्थिति में गलत परिणाम देता है। इस दृष्टिकोण से काम नहीं करने के बारे में अधिक विस्तार के लिए मेरी टिप्पणी stackoverflow.com/a/858270/2055492 पर देखें ।
cfc

न केवल जाएगा !aसच के लिए परीक्षण undefined, यह भी के लिए सच का परीक्षण करती है 0और nullऔर false। यह बहुत गलत है और इसे हटाया जाना चाहिए।
स्टीफन एम इरविंग

2

मैं अक्सर सबसे सरल तरीके का उपयोग करता हूं:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

संपादित करें:

वैरिएबल को इनिशियलाइज़ किए बिना, अपवाद को फेंक दिया जाएगा "अनक्रीफ़्ड रेफ़रेंस एरर: वेरिएबल डिफाइन नहीं है ..."


2
Uncaught ReferenceError: variable is not defined
मुहम्मद उमर

@ मुहम्मदउमर, गलत! variableद्वारा परिभाषित किया गया है var variable;। और यह स्निपेट variableस्थानीय दायरे में ओवरराइड हो जाएगा । यह तर्क को तोड़ सकता है जो एक करीबी या वैश्विक चर तक पहुंचने की उम्मीद करता है। Ie:var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
гвгений Савичев

2

एक अन्य संभावित "समाधान" windowवस्तु का उपयोग करना है। यह एक ब्राउज़र में जब संदर्भ त्रुटि समस्या से बचा जाता है।

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}

यह मूल प्रश्न को बिल्कुल हल नहीं करता है और पूरी तरह अप्रासंगिक है। पोस्टर यह नहीं पूछ रहा था कि परीक्षण कैसे करना है यदि कुछ सत्य या गलत है, तो उन्होंने पूछा कि परीक्षण कैसे करना है undefined। ऐसा नहीं करेगा।
स्टीफन एम इरविंग

2

त्रुटि आपको बता रही है कि xमौजूद नहीं है! यह घोषित नहीं किया गया है , जो एक मान निर्दिष्ट किए जाने से अलग है ।

var x; // declaration
x = 2; // assignment

यदि आपने घोषित किया x, तो आपको कोई त्रुटि नहीं मिलेगी। आपको एक चेतावनी मिलेगी जो कहती है undefinedक्योंकिx मौजूद है / घोषित किया गया है लेकिन एक मान निर्दिष्ट नहीं किया गया है।

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

if(typeof x  !==  "undefined") {
    alert(x);
}

यह में संग्रहीत मान के प्रकार की जाँच कर रहा है x। यह केवल तभी वापस आएगा undefinedजब xघोषित नहीं किया गया है या यदि यह घोषित नहीं किया गया है और अभी तक सौंपा नहीं गया है।


अपरिभाषित ES5 (2009 रिलीज) के बाद से आसानी से पढ़ा गया है और आपको अब typeofऑपरेटर की आवश्यकता नहीं है ।
स्टीफन एम इरविंग

2

voidऑपरेटर रिटर्न undefinedकिसी भी तर्क / अभिव्यक्ति के लिए यह करने के लिए पारित कर दिया। ताकि आप परिणाम के खिलाफ परीक्षण कर सकते हैं (वास्तव में कुछ minifiers से अपने कोड को बदलने undefinedके लिएvoid 0 को बचाने के )

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

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}

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

ईएस 5 से पहले भी यह सुरक्षित था क्योंकि तब भी अगर आपने undefinedभरोसा दिया था , तो ईश्वर ही जानता है कि क्या कारण है, इसका उपयोग करने से void 0आपको कोई रिटर्न नहीं मिलेगाundefined
स्टीफन एम इरविंग


1

बस नीचे कुछ पसंद है:

function isNotDefined(value) {
  return typeof value === "undefined";
}

और इसे कॉल करें:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false

0

स्वीकृत उत्तर सही है। बस एक और विकल्प जोड़ना चाहता था। आप try ... catchइस स्थिति को संभालने के लिए ब्लॉक का भी उपयोग कर सकते हैं । एक अजीब उदाहरण:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

catchब्लॉक से अवगत रहें , जो थोड़ा गड़बड़ है, क्योंकि यह ब्लॉक-स्तरीय गुंजाइश बनाता है। और, ज़ाहिर है, पूछे गए प्रश्न का उत्तर देने के लिए उदाहरण बेहद सरल है, यह त्रुटि हैंडलिंग में सर्वोत्तम प्रथाओं को कवर नहीं करता है;)।


0

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

var my_variable;त्वरित नहीं - त्वरित -var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

फिर आप यह जांचने के लिए एक सशर्त विवरण का उपयोग कर सकते हैं कि चर को इस तरह परिभाषित और तात्कालिक रूप से परिभाषित किया गया है ...

if ( varExists(variable_name) ) { // checks that it DOES exist } 

या परीक्षण करने के लिए कि यह परिभाषित नहीं किया गया है और तत्काल उपयोग ...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }

1
क्यों नहीं अपने विधेय को तुरंत लौटा दें? return typeof el !== "undefined" && typeof el.val() !== "undefined"
skubski
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.