यदि चर मौजूद है तो जावास्क्रिप्ट चेक करें (परिभाषित / आरंभिक है)


1762

अगर चर को इनिशियलाइज़ किया गया है तो जाँचने का कौन सा तरीका बेहतर / सही है? (यह मानते हुए कि चर कुछ भी पकड़ सकता है (स्ट्रिंग, इंट, ऑब्जेक्ट, फ़ंक्शन, आदि))

if (elem) { // or !elem

या

if (typeof(elem) !== 'undefined') {

या

if (elem != null) {

5
यदि आप यह जानना चाहते हैं कि क्या fooघोषित है, या तोtypeof foo === 'undefined'typeof foo === typeof undefined

1
अत्यधिक उत्तोलित उत्तर उन चरों के लिए काम नहीं करते हैं जो घोषित किए गए हैं, लेकिन उनका मूल्य है undefined। सही उत्तर यह है: stackoverflow.com/a/36432729/772035
पॉल

@Paulpro, का उपयोग करने वाले संस्करण hasOwnProperty('bar')में अन्य की तरह ही कमियां नहीं हैं, लेकिन नोड (इसके windowसाथ प्रतिस्थापित global) के लिए कुछ समायोजन की आवश्यकता होगी ।
ऑलिगॉफ्रेन

@Paulpro वास्तव में, लेकिन जैसा कि मैं विचार कर रहा था कि इससे पहले कि आप उत्तर दें, मैं इस निष्कर्ष पर पहुंचा कि यह वास्तव में एक व्यावहारिक समस्या नहीं है। जब आप ब्लॉक या फंक्शन स्कॉप्ड वेरिएबल्स के साथ काम कर रहे होते हैं, तो यह आमतौर पर आपके पास कोड होता है या आपके पास लिखने के लिए पहुंच होता है, इसलिए आपको किसी भी मामले में रनटाइम त्रुटि होगी जो कि ठीक करने योग्य है। जबकि चर के साथ सामान्य समस्या जिसे परिभाषित नहीं किया गया है (मौजूद नहीं है) आमतौर पर आपके नियंत्रण से बाहर कोड में निहित है, इसलिए आपको इसका पता लगाने का एक तरीका चाहिए। तो यह 80/20 समाधान है।
ऑलिगॉफ्रेन

जवाबों:


3049

यदि आप चाहते ऑपरेटर । विशेष रूप से:typeof

if (typeof variable !== 'undefined') {
    // the variable is defined
}

35
यह एक अच्छा समाधान दिखता है, लेकिन क्या आप बता सकते हैं कि यह क्यों काम करता है?
मॉर्गन चेंग

46
वास्तव में, आपको यह जांचना चाहिए कि ऑब्जेक्ट वह है जिसकी आपको आवश्यकता है। ऐसा होगा यदि (टाइपो कंसोल == 'ऑब्जेक्ट') {// वैरिएबल है जो मुझे इसकी आवश्यकता है}
स्टेटिक्सन

59
@ जॉर्ज चतुर्थ: "बस करो 'अगर (चर)" - उम, नहीं, जो झूठे और 0. के लिए विफल रहता है
जेसन एस

17
'यदि (चर)' वस्तु गुणों के अस्तित्व के परीक्षण के लिए भी विफल हो जाता है।
Scotts

54
@ geowa4 वास्तव में, यदि चर अपरिभाषित है, तो एक त्रुटि होगी।
केविनजी

856

typeofयदि चर वास्तव में अपरिभाषित है ऑपरेटर की जाँच करेगा।

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

typeofऑपरेटर, अन्य ऑपरेटरों के विपरीत, एक फेंक नहीं है ReferenceError अपवाद है जब एक अघोषित चर के साथ प्रयोग किया।

हालांकि, ध्यान दें कि typeof nullवापस आ जाएगा "object"। हमें किसी चर को शुरू करने की गलती से बचने के लिए सावधान रहना होगा null। सुरक्षित रहने के लिए, इसके बजाय हम इसका उपयोग कर सकते हैं:

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

===सरल समानता के बजाय सख्त तुलना का उपयोग करने के बारे में अधिक जानकारी के लिए ==, देखें:
जावास्क्रिप्ट जेलों में किस ऑपरेटर (== बनाम ===) का उपयोग किया जाना चाहिए?


2
अगर (वैरिएबल_हेयर) {// आपका कोड यहां। }; नहीं बता सकता है कि चर गलत है या अपरिभाषित है
boh

5
if(! variable_here)कई मामलों में टूट जाएगा। यदि चर 0 या गलत है, तो यह विफल हो जाएगा। वही नहीं जो आप चाहते हैं।
कोरी डेनियलसन

2
तय नहीं कर सकते कि यह वोट देना है या नहीं। सख्ती से बोलना typeof foo === "undefined"सही है, और शीर्ष मतदान के उत्तर से बेहतर है, लेकिन अतिरिक्त नोट्स इस उत्तर को भ्रमित करते हैं।
अलनीतक

1
@StevenPenny समयरेखा की जाँच करें। शीर्ष जवाब से विलय हो गया एक और सवाल के बाद इस उत्तर पोस्ट किया गया था
रोब

1
यह जवाब काम नहीं करता है। यहाँ केवल यही एक उत्तर है जो काम करता है: stackoverflow.com/a/36432729/772035
पॉल

221

कई मामलों में, का उपयोग कर:

if (elem) { // or !elem

आप के लिए काम करेंगे! ... यह इन मामलों की जाँच करेगा:

  1. अपरिभाषित : यदि मान परिभाषित नहीं है और यह हैundefined
  2. null : यदि यह शून्य है, उदाहरण के लिए, यदि DOM तत्व मौजूद नहीं है ...
  3. खाली स्ट्रिंग :''
  4. 0 : संख्या शून्य
  5. NaN : एक संख्या नहीं
  6. असत्य

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

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

इसके अलावा, ये चेक केवल मानों के लिए हैं , क्योंकि ऑब्जेक्ट्स और एरेज़ जावास्क्रिप्ट में अलग तरह से काम करते हैं, खाली एरे []और खाली ऑब्जेक्ट {}हमेशा सही होते हैं ।

मैं उत्तर की त्वरित जानकारी दिखाने के लिए नीचे की छवि बनाता हूं:

अपरिभाषित, अशक्त, आदि


2
@ अलीजा, अच्छा! आपका जवाब वहाँ से बाहर बहुत से लोगों की मदद करेगा। मैंने पहले से ही इन झूठे मूल्यों को याद किया था, केवल एक चीज जो मुझे यकीन नहीं था कि []।
थियागो योतिथी

13
मुझे एक "ReferenceError: elem परिभाषित नहीं किया गया है"
ropo

3
@ रोपो, यह इसलिए है क्योंकि आपने यह जाँचने के लिए एलम को परिभाषित नहीं किया है कि यह क्या है, यदि यह आपका मामला है, तो आपको इसे टाइपोफ (एलएमएम) === "स्ट्रिंग" के साथ जांचना होगा, जो पहले से ही उल्लेख किया गया है ...
एलिरेज़ा

19
तब जवाब भ्रामक होता है जब यह कहता है कि if(elem)अपरिभाषित के लिए चेक (जबकि यह परिभाषित त्रुटि नहीं देता है), है ना?
फंकी

1
मुझे जाँचने के लिए एक उपयोग का मामला दें कि क्या कोई चर अपरिभाषित है और यदि अपरिभाषित मान से परिभाषित किया गया है? आप में से कुछ लोग तिनके का सहारा ले रहे हैं और शानदार दिखने का प्रयास कर रहे हैं, लेकिन यदि आप एक मूल्य को अपरिभाषित मान रहे हैं और उस मूल्य की जाँच कर रहे हैं, तो जाहिर है कि यह गलत होगा या आपको अपना कोड बदलने की आवश्यकता होगी, smh .... यह उत्तर सही है !! !!!
अल्माक्फी

210

जावास्क्रिप्ट में, एक चर को परिभाषित किया जा सकता है, लेकिन मान को पकड़ें undefined, इसलिए सबसे आम उत्तर तकनीकी रूप से सही नहीं है, और इसके बजाय निम्नलिखित कार्य करता है:

if (typeof v === "undefined") {
   // no variable "v" is defined in the current scope
   // *or* some variable v exists and has been assigned the value undefined
} else {
   // some variable (global or local) "v" is defined in the current scope
   // *and* it contains a value other than undefined
}

जो आपके उद्देश्यों के लिए पर्याप्त हो सकता है। निम्नलिखित परीक्षण में सरल शब्दार्थ है, जो आपके कोड के व्यवहार का ठीक-ठीक वर्णन करना और इसे स्वयं समझना आसान बनाता है (यदि आप ऐसी चीजों की परवाह करते हैं):

if ("v" in window) {
   // global variable v is defined
} else {
   // global variable v is not defined
}

यह, निश्चित रूप से, मानता है कि आप एक ब्राउज़र में चल रहे हैं (जहां windowवैश्विक ऑब्जेक्ट के लिए एक नाम है)। लेकिन अगर आप इस तरह से ग्लोबल्स के साथ घूम रहे हैं तो आप शायद एक ब्राउज़र में हैं। ग्लोबल्स को संदर्भित करने के लिए 'name' in windowउपयोग करते हुए , विशेष रूप से , शैलीगत रूप से सुसंगत है window.namewindowचर के बजाय के रूप में ग्लोबल्स तक पहुँचने से आप अपने कोड (अस्तर के लाभ के लिए) में आपके द्वारा संदर्भित अघोषित चर की संख्या को कम कर सकते हैं, और स्थानीय चर द्वारा आपके वैश्विक होने की संभावना से बचते हैं। इसके अलावा, अगर ग्लोबल्स आपकी त्वचा को क्रॉल करते हैं, तो आप केवल इस अपेक्षाकृत लंबी छड़ी के साथ उन्हें छूने में अधिक सहज महसूस कर सकते हैं।


7
यह केवल जाँच करता है कि चर विश्व स्तर पर घोषित किया गया था या नहीं। यदि आप ठीक से कोडिंग कर रहे हैं, तो आप अपने वैश्विक संस्करणों को सीमित कर रहे हैं। यह स्थानीय वेरिएशन के लिए गलत रिपोर्ट करेगा: (फ़ंक्शन () {var sdfsfs = 10; कंसोल.log ("sdfsfs" विंडो में);}) () `
एडी मेन्ज जूनियर

2
यह सबसे अच्छा f $ # ^% ing जवाब है। मैं यह समझने की कोशिश कर रहा था कि इस कोने के मामले का हिसाब कैसे लगाया जाए। प्रतिभाशाली। पता नहीं आप ऐसा कर सकते थे।
temporary_user_name

1
हेड-अप: आपका जवाब यहां से stackoverflow.com/questions/519145/… पर
Shog9

कोणीय उपयोगकर्ताओं के लिए: दुर्भाग्य से, यह एनजी-इफ स्टेटमेंट में अनुमति नहीं देता है।
qwertzguy

... गुंजाइश के साथ जाँच के लिए एकदम सही खाका। क्या आपके पास कोई प्रदर्शन संकेत है, अगर "विंडो में" या "(टाइपो वैरिएबल === 'अपरिभाषित') - चर === अशक्त)" || वास्तव में मुझे एक कठिन तथ्य परीक्षण में दिलचस्पी है और तर्कपूर्ण संभावित तर्क में नहीं है (जो मैं खुद कर सकता था: दूसरे खंड में अधिक संचालन हैं -> इससे भी बदतर प्रदर्शन)
क्विक

119

आपके द्वारा उपयोग किए जाने वाले अधिकांश मामलों में:

elem != null

एक साधारण के विपरीत if (elem), यह अनुमति देता है 0, false, NaNऔर '', लेकिन खारिज कर दिया nullया undefined, यह एक अच्छा, सामान्य परीक्षण कर रही एक बहस की उपस्थिति, या एक वस्तु की संपत्ति के लिए।


अन्य चेक गलत भी नहीं हैं, उनके अलग-अलग उपयोग हैं:

  • if (elem): अगर इस्तेमाल किया जा सकता elemएक वस्तु होने की गारंटी है, या यदि false, 0आदि माना जाता है (करने के लिए इसलिए बराबर "डिफ़ॉल्ट" मूल्यों undefinedया null)।

  • typeof elem == 'undefined'उन मामलों में इस्तेमाल किया जा सकता है जहां एक निर्दिष्ट के nullपास एक असंबद्ध चर या संपत्ति का एक अलग अर्थ है।

    • यह केवल जांच कर लें कि है एक त्रुटि फेंक नहीं होगा अगर elemनहीं है की घोषणा की (यानी कोई varबयान, की नहीं एक संपत्ति window, या नहीं एक समारोह तर्क)। यह मेरी राय में, बल्कि खतरनाक है क्योंकि यह टाइपोस को किसी का ध्यान नहीं देने की अनुमति देता है। इससे बचने के लिए, नीचे दी गई विधि देखें।

इसके अलावा उपयोगी एक सख्त तुलना है undefined:

if (elem === undefined) ...

हालाँकि, क्योंकि वैश्विक undefinedको दूसरे मूल्य के साथ ओवरराइड किया जा सकता है , इसलिए undefinedइसका उपयोग करने से पहले मौजूदा दायरे में चर घोषित करना सबसे अच्छा है:

var undefined; // really undefined
if (elem === undefined) ...

या:

(function (undefined) {
    if (elem === undefined) ...
})();

इस पद्धति का एक माध्यमिक लाभ यह है कि जेएस मिनिफ़ायर undefinedचर को एक एकल वर्ण तक कम कर सकते हैं , जिससे आप हर बार कुछ बाइट्स बचा सकते हैं।


17
मैं हैरान हूं कि आप ओवरराइड कर सकते हैं undefined। मुझे नहीं लगता कि यह जवाब में ध्यान देने योग्य है। सभी जावास्क्रिप्ट में संभवतः सबसे खराब स्वीकार्य चर नाम है।
कोरी डेनियलसन

2
यह अपवाद का कारण बनता है और आपको window.वैश्विक संदर्भ में उपयोग किए जाने वाले चर से पहले उपयोग करने की आवश्यकता होती है ... यह सबसे अच्छा तरीका नहीं है।
एलेक्स डब्ल्यूएपी

4
इस ओवरराइडिंग समस्या के कारण आपको void(0)इसके बजाय ALWAYS का उपयोग करना चाहिए undefined
बार्टोलोमिएज ज़ाल्स्की

+1 कि बाहर क्या यह उत्तर अंक के बाद से कभी कभी आप वास्तव में कर सकते हैं चाहते हैं की पहचान करने false, 0अमान्य मान के रूप में, आदि।
रिनोगो

77

अगर जाँच करें windowhasOwnProperty( " varname" )

typeofउत्तरों के ढेरों के लिए एक विकल्प ;

var varname = value;वैश्विक दायरे में एक बयान के साथ वैश्विक चर घोषित किए गए

खिड़की वस्तु के गुणों के रूप में पहुँचा जा सकता है।

जैसे, hasOwnProperty()विधि, जो

एक बूलियन को इंगित करता है कि क्या वस्तु में निर्दिष्ट संपत्ति अपनी संपत्ति के रूप में है (जैसा कि इसे विरासत में मिला है)

यह निर्धारित करने के लिए इस्तेमाल किया जा सकता है कि क्या

एक varकी "VARNAME" विश्व स्तर पर घोषित किया गया है यानी की संपत्ति है window

// Globally established, therefore, properties of window
var foo = "whatever", // string
    bar = false,      // bool
    baz;              // undefined
//  window.qux does not exist

console.log( [
    window.hasOwnProperty( "foo" ), // true
    window.hasOwnProperty( "bar" ), // true
    window.hasOwnProperty( "baz" ), // true
    window.hasOwnProperty( "qux" )  // false
] );

इसके बारे hasOwnProperty()में बहुत अच्छी बात यह है कि इसे कॉल करने में, हम एक ऐसे चर का उपयोग नहीं करते हैं जो अभी तक अघोषित हो सकता है - जो पहली जगह में आधी समस्या है।

हालांकि नहीं हमेशा सही या आदर्श समाधान है, कुछ निश्चित परिस्थितियों में, यह सिर्फ काम है!

टिप्पणियाँ

varएक चर को परिभाषित करने के लिए उपयोग करते समय उपरोक्त सत्य है , letजिसका विरोध किया गया है :

ब्लॉक स्कोप लोकल वैरिएबल घोषित करता है, वैकल्पिक रूप से इसे वैल्यू पर इनिशियलाइज़ करता है।

के विपरीत है var कीवर्ड के , जो विश्व स्तर पर या स्थानीय रूप से एक पूरे फ़ंक्शन को ब्लॉक स्कोप की परवाह किए बिना एक चर को परिभाषित करता है।

इसके letविपरीत var, कार्यक्रमों और कार्यों के शीर्ष स्तर पर, वैश्विक वस्तु पर कोई संपत्ति नहीं बनती है।

पूर्णता के लिए: const स्थिरांक, परिभाषा के अनुसार, वास्तव में परिवर्तनीय नहीं हैं (हालांकि उनकी सामग्री हो सकती है); अधिक प्रासंगिक रूप से:

वैश्विक स्थिरांक इसके विपरीत, विंडो ऑब्जेक्ट के गुण नहीं बनते हैं var चरों के । एक स्थिरांक के लिए एक इनिलाइज़र की आवश्यकता होती है; यही है, आपको इसके मूल्य को उसी कथन में निर्दिष्ट करना होगा जिसमें यह घोषित किया गया है।

एक स्थिरांक का मान पुनर्मूल्यांकन के माध्यम से नहीं बदल सकता है, और इसे फिर से घोषित नहीं किया जा सकता है।

कांस्ट ऐलान मूल्य के लिए केवल-पढ़ने के लिए संदर्भ बनाता है। इसका मतलब यह नहीं है कि यह जो मूल्य रखता है वह अपरिवर्तनीय है, बस यह कि चर पहचानकर्ता को आश्वस्त नहीं किया जा सकता है।

चूँकि letचर या constस्थिरांक कभी भी किसी भी वस्तु के गुण नहीं होते हैं जो hasOwnProperty()विधि को विरासत में मिला है , इसका उपयोग उनके अस्तित्व की जाँच के लिए नहीं किया जा सकता है।

की उपलब्धता और उपयोग के बारे में hasOwnProperty():

हर वस्तु के वंशज वस्तु विरासत में hasOwnProperty()विधि। [...] inऑपरेटर के विपरीत , यह विधि ऑब्जेक्ट की प्रोटोटाइप श्रृंखला की जांच नहीं करती है।


1
यह एक भयानक विकल्प है और इस प्रश्न के शीर्ष पर होना चाहिए। कृपया एक उदाहरण के साथ रिटर्न हेडलाइन को एक कार्यशील उदाहरण के रूप में सरल करें जो रिटर्न करता है true(जैसे window.hasOwnProperty('console')या var hop = "p";window.hasOwnProperty('hop'))।
CPHPython

2
अंत में कुछ ऐसा है जो एक सदस्य तक पहुँचने के कारण त्रुटि नहीं करता है जो मौजूद नहीं है ... कुछ सभी typeofउत्तर बस अनदेखी करते हैं।
ज़ेल्फिर कलस्टहल

1
यह उत्तर पुराना है - मानक ECMAScript के अनुसार आप उन चर को परिभाषित कर सकते हैं letजहाँ ये चर window[या किसी अन्य] वस्तु के गुणों के रूप में उपलब्ध नहीं हैं । गुणों कीhasOwnProperty उपस्थिति के लिए परीक्षण , चर नहीं और इस प्रकार परिभाषित चर का पता लगाने के लिए उपयोग नहीं किया जा सकता है । let
am

1
@amn का उपयोग के संबंध में उत्तर सही varहै और उस संबंध में पुराना नहीं है। मैंने हालांकि एक नोट जोड़ा है जिसमें बताया गया है कि किस तरह का उपयोग letऔर constउससे अलग है var। आपकी प्रेरणा के लिए धन्यवाद; हम एक साथ उठते हैं :)
फ्रेड गंड

1
@amn मैंने उत्तर को फिर से लिखा है (उम्मीद है कि आखिरी बार) और अधिक स्पष्ट करने के लिए जिसे hasOwnPropertyकेवल varचर के अस्तित्व की जांच के लिए निर्धारित तरीके से उपयोग किया जा सकता है । यह मुझे ठीक लगता है।
फ्रेड गंडट

68

अगर एक चर मौजूद है तो कैसे जांचें

यह एक परीक्षण के लिए एक सुंदर बुलेटप्रूफ समाधान है यदि एक चर मौजूद है और इसे आरंभीकृत किया गया है:

var setOrNot = typeof variable !== typeof undefined;

इसका उपयोग आम तौर पर एक टर्नरी ऑपरेटर के साथ संयोजन में किया जाता है ताकि एक निश्चित चर को आरंभिक नहीं किया जा सके।

var dark = typeof darkColor !== typeof undefined ? darkColor : "black";

इनकैप्सुलेशन की समस्या

दुर्भाग्यवश, आप किसी फ़ंक्शन में अपनी जांच को सरलता से शामिल नहीं कर सकते हैं।

आप ऐसा कुछ करने की सोच सकते हैं:

function isset(variable) {
    return typeof variable !== typeof undefined;
}

हालाँकि, यदि आप उदाहरण के लिए कॉल कर रहे हैं, तो यह एक संदर्भ त्रुटि उत्पन्न करेगा। isset(foo)और चर fooको परिभाषित नहीं किया गया है, क्योंकि आप किसी फ़ंक्शन में गैर-मौजूदा चर के साथ पास नहीं कर सकते हैं:

बिना संदर्भ संदर्भित: foo परिभाषित नहीं है


यह जांचना कि फ़ंक्शन पैरामीटर अपरिभाषित हैं या नहीं

हालांकि हमारे issetफ़ंक्शन का उपयोग यह परीक्षण करने के लिए नहीं किया जा सकता है कि एक चर मौजूद है या नहीं (कारणों के बारे में बताया गया है), यह हमें परीक्षण करने की अनुमति देता है कि क्या फ़ंक्शन के पैरामीटर अपरिभाषित हैं:

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

भले ही yफ़ंक्शन के लिए कोई मान पारित नहीं किया जाता है test, हमारा issetफ़ंक्शन इस संदर्भ में पूरी तरह से काम करता है, क्योंकि yफ़ंक्शन testमें एक undefinedमूल्य के रूप में जाना जाता है ।


41

जब आप साधारण असाइनमेंट और संबंधित चेक करते हैं, तो इसे चेक करने के लिए एक और शॉर्ट हैंड तरीका होता है। बस कंडिशनर (टर्नरी) ऑपरेटर का उपयोग करें

var values = typeof variable !== 'undefined' ? variable : '';

इसके अलावा यह तब मददगार होगा, जब आप संदर्भ चर के उदाहरण असाइनमेंट के साथ ग्लोबल वैरिएबल को घोषित करने का प्रयास करेंगे।

यदि आप चर की जांच करना चाहते थे undefinedया नहीं होना चाहिए null। फिर नीचे जाँच करें।

जब चर घोषित किया जाता है, और यदि आप मूल्य की जांच करना चाहते हैं, तो यह और भी सरल है: और यह एक साथ प्रदर्शन undefinedऔर nullजांच करेगा ।

var values = variable ? variable : '';

इसका उत्तर गलत है। टाइपो वैरिएबल हमेशा एक स्ट्रिंग देता है, इस प्रकार यह कभी भी गलत नहीं होता है। जैसे अगर typeof(booooo)है "undefined"तो हमेशा typeof(typeof boooooo)है "string"और typeof boooooo && trueहै true। @ जॉन-सलेगर्स का उत्तर संक्षिप्त रूप में है जैसा कि आप टाइपोफ के साथ प्राप्त कर सकते हैं।
मप्र

इसका बिलकुल सही उत्तर हैयहां एक वर्किंग फिडल है । और मैं नहीं जानता कि आप किस परिदृश्य की बात कर रहे हैं। प्रश्न चर अस्तित्व की जाँच के बारे में है।
राजेशदेव

@mpag फ्लैट को गलत मत कहो। इसे साबित करो । गलती ढूंढना वास्तविक आसान है, इसके बजाय आप यहाँ अच्छे उत्तर दे सकते हैं !!!। यदि उत्तर सपाट है तो 28 प्रोग्रामर मेरे उत्तर की जाँच किए बिना मतदान नहीं करेंगे। चूँकि यहाँ कई प्रतिष्ठित उत्तर हैं, इसलिए वे इसे वोट कर सकते थे, यह नहीं।
राजेशदेव

वास्तव में कोड का दूसरा टुकड़ा, ऊपर की स्थिति के समान जांचना नहीं है। मैंने सोचा था कि लोग इस लाइन को समझेंगे If you wanted to check variable shouldn't be undefined or null., इस टिप्पणी से, इसकी स्पष्ट रूप से बताते हुए, इसकी चर घोषणा की जांच नहीं करेंगे। कि चर मूल्य की जाँच करने के लिए है।
राजेशदेव

1
आपका दूसरा चेक 0 मान के साथ विफल हो जाएगा
फरीद अलनामृती

32

एक चर का परीक्षण करने का छोटा तरीका घोषित नहीं किया गया है (अपरिभाषित नहीं है)

if (typeof variable === "undefined") {
  ...
}

मैंने इसे एक ब्राउज़र के बाहर चलने वाली स्क्रिप्ट का पता लगाने के लिए उपयोगी पाया (घोषित windowचर नहीं)।


क्या यह "कैनोनिकल तरीका" है जो पोर्टेबल है?
जेसन

3
ये गलत है। window.bar=undefinedपरिभाषित किया गया है और एक मूल्य पर सेट किया गया है। आपका उत्तर इस और अगर चर मौजूद नहीं है के बीच अंतर का पता लगाने में विफल रहता है। अगर आपने ऐसा किया होता this.hasOwnProperty('bar')तो शायद काम हो जाता।
ऑलिगॉफ्रेन

यह कोड काम नहीं करता है और आप इसे किसी भी ब्राउज़र कंसोल का उपयोग करके सत्यापित कर सकते हैं
ha9u63ar

1
विचार करें const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();। परिवर्तनीय xको परिभाषित किया गया है लेकिन गलत लौटाया गया है ...
user2878850

29

यह निर्भर करता है कि क्या आप केवल इस बात की परवाह करते हैं कि चर को परिभाषित किया गया है या यदि आप चाहते हैं कि इसका सार्थक मूल्य हो।

यदि अपरिभाषित प्रकार की जांच की जाती है, तो यह जांचा जाएगा कि क्या चर को अभी तक परिभाषित किया गया है।

=== nullया !== nullकेवल तभी जाँच करेगा जब चर का मान ठीक हैnull

== nullया != nullअगर मान है undefinedया जाँच करेगा null

if(value)यदि चर रहा है की जाँच करेगा undefined, null, 0, या एक खाली स्ट्रिंग।


12

उच्चतम उत्तर सही है, टाइपोफ़ का उपयोग करें।

हालाँकि, जो मैं इंगित करना चाहता था वह यह था कि जावास्क्रिप्ट undefinedमें परिवर्तनशील (कुछ अकारण कारण) है। तो बस के लिए एक चेक varName !== undefinedकरने की क्षमता हमेशा के रूप में आप इसे करने के लिए उम्मीद के रूप में वापस नहीं है, क्योंकि अन्य lib अपरिभाषित बदल सकते हैं। कुछ उत्तर (@ skalee's, एक के लिए), का उपयोग नहीं करना पसंद करते हैं typeof, और यह एक मुसीबत में पड़ सकता है।

इसे संभालने का "पुराना" तरीका किसी भी संभावित म्यूटिंग / ओवर-राइडिंग को ऑफ़सेट करने के लिए एक संस्करण के रूप में अपरिभाषित घोषित कर रहा था undefined। हालांकि, सबसे अच्छा तरीका अभी भी उपयोग करना है typeofक्योंकि यह undefinedअन्य कोड से किसी भी ओवरराइडिंग को अनदेखा करेगा । खासकर यदि आप जंगली में उपयोग के लिए कोड लिख रहे हैं, जहां कौन जानता है कि पृष्ठ पर और क्या हो सकता है ...


1
बिंदु मूट है, क्योंकि अगर varName अपरिभाषित है तो varName !== undefinedबस एक ReferenceError का कारण होगा। की अस्थिरता undefinedइच्छा कोई फर्क नहीं।
वुतज़

हेड-अप: आपका जवाब यहां से stackoverflow.com/questions/519145/… पर
Shog9

1
नए जावास्क्रिप्ट संस्करणों undefinedमें केवल पढ़ने के लिए संपत्ति है। हालांकि बुलेटप्रूफ होने के लिए आप इसका इस्तेमाल कर सकते हैं typeof mvVar === typeof void 0। हमेशा void 0लौटता है undefined
kwarnke

11
if (typeof console != "undefined") {    
   ...
}

या और अच्छा

if ((typeof console == "object") && (typeof console.profile == "function")) {    
   console.profile(f.constructor);    
}

सभी ब्राउज़रों में काम करता है


3
आपकी राय में उत्तरार्द्ध क्यों बेहतर है?
स्कैली

3
@ एस्ले मैं सहमत हूं कि बाद बेहतर है। यह उस सरल कारण के लिए जिसे आप जांचते हैं कि क्या वे प्रकार हैं जो आप उन्हें उपयोग करने से पहले चाहते हैं।
ब्रुकज़िएर

हेड-अप: आपका जवाब यहां से stackoverflow.com/questions/519145/… पर
Shog9

9

बहस में योगदान करने के लिए, अगर मुझे पता है कि चर को एक स्ट्रिंग या एक वस्तु होना चाहिए जिसे मैं हमेशा पसंद करता हूं if (!variable), इसलिए यह जाँचता है कि क्या गलत है। यह अधिक स्वच्छ कोड ला सकता है ताकि, उदाहरण के लिए:

if (typeof data !== "undefined" && typeof data.url === "undefined") {
    var message = 'Error receiving response';
    if (typeof data.error !== "undefined") {
        message = data.error;
    } else if (typeof data.message !== "undefined") {
        message = data.message;
    }
    alert(message); 
}

..नहीं घटाया जाएगा:

if (data && !data.url) {
  var message = data.error || data.message || 'Error receiving response';
  alert(message)
} 


यह वह नहीं है जो ओपी ने पूछा था। यदि data.url ''आपके समाधान के बराबर है , तो इसे अपरिभाषित माना जाएगा, जब यह वास्तव में खाली स्ट्रिंग युक्त के रूप में परिभाषित किया गया हो।
डेमनब्लेक

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

8

अपरिभाषित और अशक्त के बीच अंतर करना मुश्किल है। Null वह मान है जिसे आप किसी चर में असाइन कर सकते हैं जब आप यह संकेत करना चाहते हैं कि चर का कोई विशेष मूल्य नहीं है। अनिर्धारित एक विशेष मूल्य है जो अनसाइन किए गए चर का डिफ़ॉल्ट मान होगा।


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);


1
प्रत्येक अलर्ट के आउटपुट को दर्शाने में मददगार होगा।
demisx

@demisx सहमत हैं, लेकिन संपादित करने का सुझाव देने के बजाय, बस इसे क्यों नहीं बनाते हैं? एक कारण के लिए विकल्प है। कुछ इसे असभ्य मान सकते हैं; मैं इसे कुशल मानता हूँ - इसलिए उत्तर को स्वयं संपादित किया (लंबित समीक्षा)।
फ्रेड गंदट

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

8

Null जावास्क्रिप्ट में एक मान है और typeof null रिटर्न"object"

इसलिए, यदि आप शून्य मान पास करते हैं, तो स्वीकृत उत्तर काम नहीं करेगा। यदि आप अशक्त मान पास करते हैं, तो आपको अशक्त मानों के लिए एक अतिरिक्त जाँच जोड़ने की आवश्यकता है:

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}

7

सबसे मजबूत 'यह परिभाषित है' चेक टाइपो के साथ है

if (typeof elem === 'undefined')

यदि आप एक परिभाषित करने के लिए एक परिभाषित चर के लिए बस जाँच कर रहे हैं, एक लाइनर को पढ़ने के लिए आसान के लिए आप अक्सर ऐसा कर सकते हैं:

elem = elem || defaultElem;

यह अक्सर उपयोग करने के लिए ठीक है, देखें: जावास्क्रिप्ट में डिफ़ॉल्ट मान सेट करने के लिए मुहावरेदार तरीका

टाइपो कीवर्ड का उपयोग करने वाला यह एक लाइनर भी है :

elem = (typeof elem === 'undefined') ? defaultElem : elem;

7

आप typeofऑपरेटर का उपयोग कर सकते हैं ।

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

var dataSet;

alert("Variable dataSet is : " + typeof dataSet);

कोड स्निपेट से ऊपर आउटपुट की तरह वापस आ जाएगा

चर डेटासेट है: अपरिभाषित।


1
हेड-अप: आपका जवाब यहां से stackoverflow.com/questions/519145/… पर
Shog9

7

यह जाँचने के लिए कि क्या एक चर घोषित किया गया है / सेट मैंने यह गंदा चाल चली।

मुझे किसी फ़ंक्शन के साथ भी कोड निकालने का कोई तरीका नहीं मिला है eval

"use strict";

// var someVar;

var declared;
try {
  someVar;
  declared = true;
} catch(e) {
  declared = false;
}

if (declared) {
  console.log("someVar is declared; now has the value: " + someVar);
} else {
  console.log("someVar is not declared");
}

"एक फ़ंक्शन को कोड निकालें" से आपका क्या मतलब है?
मेलाब

7

ये उत्तर (फ्रेड गंड समाधान से अलग) सभी गलत या अधूरे हैं।

मान लीजिए मुझे variableName;ले जाने के लिए मेरी जरूरत हैundefined मूल्य , और इसलिए इसे इस तरह से घोषित किया गया है, var variableName;जिसका अर्थ है कि यह पहले से ही आरंभिक है ; - अगर यह पहले से ही घोषित है तो मैं कैसे जांच करूं?

या इससे भी बेहतर - मैं कैसे तुरंत जांच कर सकता हूं कि क्या "Book1.chapter22.paragraph37" एकल कॉल के साथ मौजूद है, लेकिन संदर्भ त्रुटि नहीं बढ़ती है?

हम इसे सबसे शक्तिशाली जैसवास्क्रिप्ट ऑपरेटर, इन का उपयोग करके करते हैं ऑपरेटर .:

"[variable||property]" in [context||root] 
>> true||false

AJAX के बढ़ते लोकप्रियता के समय में मैंने एक विधि (बाद में नाम) isNS () लिखी है, जो यह निर्धारित करने में सक्षम है कि क्या नामस्थान "Book1.chapter22.paragraph37" जैसे संपत्ति के नामों के लिए गहरे परीक्षण सहित मौजूद है और बहुत कुछ।

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


1
inऑपरेटर केवल संपत्ति अस्तित्व के लिए परीक्षण, और नहीं सभी चर गुण हैं - constऔर letघोषणाओं नहीं कर रहे हैं (और constनहीं भी, ठीक है, कर रहे हैं चर )।
amn

1
constऔर letECMAScript 2015 के साथ मानकीकृत किया गया था, जो 3 साल से अधिक समय पहले प्रकाशित किया गया था और तब से सामान्य संदिग्धों द्वारा अच्छी गोद लेने को देखा गया है और आज इसका व्यापक रूप से उपयोग किया जाता है, मैं कहता हूं - गितुब पर "कांस्टेबल" की 2 मिलियन से अधिक घटनाएं हैं जेएस फाइलों में
amn

हां, "चर" - बिल्कुल। यही कारण है कि मैंने आपके उत्तर पर टिप्पणी की, यह इंगित करते हुए कि आप ऑपरेटर को आम तौर पर यह परखने के लिए उपयोग नहीं कर सकते हैंin कि क्या कोई चर मौजूद है, क्योंकि "कांस्ट और लेट [प्रॉपर्टीज] नहीं हैं" - जबकि constवास्तव में कहा जा सकता है कि एक निरंतर संदर्भ, एक चर संदर्भ के विपरीत , letदूसरी ओर, वास्तव में एक चर संदर्भ पेश करता है - यह है, दूसरे शब्दों में, किसी भी उपाय से, एक चर और आपका उत्तर यह अर्थ देने में गलत है कि आप परीक्षण कर सकते हैं कि क्या कोई चर letमौजूद है। inऑपरेटर का उपयोग करके - आप नहीं कर सकते।
अमन

ECMAScript 6 विनिर्देश जावास्क्रिप्ट भाषा को परिभाषित करता है, न कि आप और न ही एक वेब ब्राउज़र। इसलिए इसे विनिर्देशन कहा जाता है - यह स्पष्ट रूप से भाषा को निर्दिष्ट करता है। आपका उत्तर सबसे पुराना है, सबसे खराब रूप से यह जानबूझकर छोड़ देता है कि आप क्या अप्रासंगिक मानते हैं, जबकि यह बहुत प्रासंगिक है। लिंक्ड स्पेक को उद्धृत करते हुए, "लेट और कास्ट डिक्लेरेशन चर को परिभाषित करते हैं"। ये निर्माण windowवस्तु के गुणों के रूप में सुलभ नहीं हैं , मुझे नहीं पता कि यह आपके लिए कैसे स्पष्ट किया जाए।
अमन

उत्तर चर के सभी मामलों को कवर नहीं करता है। विशेष रूप से, यह letकीवर्ड के साथ परिभाषित चर को कवर नहीं करता है । यही सब मैं इशारा कर रहा था।
amn

6

प्रश्न में उल्लिखित विशेष स्थिति में,

typeof window.console === "undefined"

के समान है

window.console === undefined

मैं बाद में पसंद करता हूं क्योंकि यह छोटा है।

कृपया ध्यान दें कि हम consoleकेवल वैश्विक दायरे में देखते हैं (जो windowसभी ब्राउज़रों में एक वस्तु है)। इस विशेष स्थिति में यह वांछनीय है। हम consoleकहीं और परिभाषित नहीं करना चाहते हैं।

@BrianKelley अपने महान जवाब में तकनीकी विवरण बताते हैं। मैंने केवल निष्कर्ष निकालने में कमी की है और इसे पढ़ने के लिए कुछ आसान में पचा लिया है।


हेड-अप: आपका जवाब यहां से stackoverflow.com/questions/519145/… पर
Shog9

2
असत्य। बाद वाला मेरे कंसोल में एक अपवाद फेंकता है।
जॉन ktejik

6

मैं ऑब्जेक्ट के आधार पर दो अलग-अलग तरीकों का उपयोग करता हूं।

if( !variable ){
  // variable is either
  // 1. '';
  // 2. 0;
  // 3. undefined;
  // 4. null;
  // 5. false;
}

कभी-कभी मैं एक खाली स्ट्रिंग को फाल्सी के रूप में मूल्यांकन नहीं करना चाहता हूं, इसलिए मैं इस मामले का उपयोग करता हूं

function invalid( item ){
  return (item === undefined || item === null);
}

if( invalid( variable )){
  // only here if null or undefined;
}

यदि आपको विपरीत की आवश्यकता है, तो पहले उदाहरण में! चर !! !! चर हो जाता है, और अमान्य फ़ंक्शन में === बन जाता है! = और फ़ंक्शन का नाम बदलकर notInvalid हो जाता है।


5

मेरी प्राथमिकता है typeof(elem) != 'undefined' && elem != null

हालाँकि आप चुनते हैं, चेक को किसी फ़ंक्शन में रखने पर विचार करें

function existy (x) {
    return typeof (x) != 'undefined' && x != null;
}

अगर आपको नहीं पता कि चर घोषित किया गया है तो जारी रखें typeof (x) != 'undefined' && x != null;

जहां आपको पता है कि चर घोषित है, लेकिन अस्तित्व में नहीं हो सकता है, तो आप उपयोग कर सकते हैं

existy(elem) && doSomething(elem);

आप जिस चर की जाँच कर रहे हैं वह कभी-कभी एक नेस्टेड संपत्ति हो सकती है। आप प्रोप का उपयोग कर सकते हैं || {प्रश्न में संपत्ति की मौजूदगी की जाँच करने के लिए नीचे जाने के लिए:

var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;

प्रॉपर्टी के प्रत्येक उपयोग के बाद (... '|| {}')। नेक्स्टप्रॉप ताकि कोई लापता प्रॉपर्टी एरर न फेंक दे।

या आप जैसे अस्तित्व का उपयोग कर सकते हैं existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)


यदि आप इसे किसी फंक्शन में रखते हैं, तो यह बेमानी है। घोषित होने के typeof (x) != 'undefined' && x != nullबराबर है । x != nullx
Ry-

3

यह स्थिति पर निर्भर करता है। यदि आप किसी ऐसी चीज़ की जाँच कर रहे हैं जो आपके कोड के बाहर विश्व स्तर पर परिभाषित नहीं हो सकती है (जैसे jQuery शायद) तो आप चाहते हैं:

if (typeof(jQuery) != "undefined")

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

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"

3

पकड़ने की कोशिश

यदि चर को बिल्कुल भी परिभाषित नहीं किया गया था, तो आप कोशिश कर सकते हैं कि ब्रेक कोड निष्पादन के बिना इस तरह की कोशिश कर सकते हैं- कैच ब्लॉक का उपयोग करके (आपको use strictमोड की आवश्यकता नहीं है)

बोनस: (अन्य उत्तरों की चर्चा करते हुए) क्यों ( स्रोत से ) ===अधिक स्पष्ट है==

अगर (a == b)

यहां छवि विवरण दर्ज करें

यदि (a === b)

यहां छवि विवरण दर्ज करें


1
FYI, (a ==) गेम ऑफ लाइफ ग्रिड पर रखा गया था, यह सब रोमांचक नहीं था।
जॉनसन

0

मुझे आश्चर्य है कि यह अभी तक उल्लेख नहीं किया गया था ...

यहां कुछ अतिरिक्त बदलावों का उपयोग किया गया है this['var_name']

एक चर को परिभाषित करने से पहले इस पद्धति का उपयोग करने के लाभ का उपयोग किया जा सकता है।

if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part

// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!

ये गलत है। window.bar=undefinedपरिभाषित किया गया है और एक मूल्य पर सेट किया गया है। आपका उत्तर इस और अगर चर मौजूद नहीं है के बीच अंतर का पता लगाने में विफल रहता है। अगर आपने ऐसा किया होता this.hasOwnProperty('bar')तो शायद काम हो जाता।
ऑलिगॉफ्रेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.