जावास्क्रिप्ट में अपरिभाषित या अशक्त चर की जांच कैसे करें?


500

हम अपने जावास्क्रिप्ट कोड में अक्सर निम्न कोड पैटर्न का उपयोग कर रहे हैं

if (typeof(some_variable) != 'undefined' && some_variable != null)
{
    // Do something with some_variable
}

क्या जाँच का एक कम क्रिया तरीका है जो समान प्रभाव रखता है?

कुछ मंचों और साहित्य के अनुसार केवल निम्नलिखित का समान प्रभाव होना चाहिए।

if (some_variable)
{
    // Do something with some_variable
}

दुर्भाग्य से, फायरबगsome_variable अपरिभाषित होने पर रनटाइम पर त्रुटि के रूप में इस तरह के एक बयान का मूल्यांकन करता है, जबकि पहला इसके लिए ठीक है। क्या यह फायरबग का केवल (अवांछित) व्यवहार है या वास्तव में उन दो तरीकों में कुछ अंतर है?


46
if(some_variable) { ... }अगर अमल नहीं होगा some_variableहै falseया 0या ...
kennytm

अच्छा बिंदु;) लेकिन मान लें कि मुझे पता है कि यह गलत या 0 नहीं हो सकता है और मैं सिर्फ यह जांचना चाहता हूं कि क्या मैं इसे कुछ तर्क (एक स्ट्रिंग, सरणी, आदि के रूप में) में उपयोग कर सकता हूं
टॉमस वाना


2
... या एक खाली तार।
डेविड ने

जवाबों:


333

आपको मामलों में अंतर करना होगा:

  1. चर undefinedया अघोषित हो सकते हैं । यदि आपको इसके अलावा किसी भी संदर्भ में अघोषित चर का उपयोग करने पर त्रुटि मिलेगी typeof
if(typeof someUndeclaredVar == whatever) // works
if(someUndeclaredVar) // throws error

एक वैरिएबल जिसे घोषित किया गया है लेकिन आरंभीकृत नहीं है undefined

let foo;
if (foo) //evaluates to false because foo === undefined
  1. अपरिभाषित गुण , जैसे someExistingObj.someUndefProperty। एक अपरिभाषित संपत्ति में त्रुटि नहीं होती है और बस रिटर्न होता है undefined, जो जब एक बूलियन में परिवर्तित होता है, तो मूल्यांकन करता है false। तो, अगर आप परवाह नहीं करते हैं 0और false, का उपयोग if(obj.undefProp)करना ठीक है। इस तथ्य पर आधारित एक सामान्य मुहावरा है:

    value = obj.prop || defaultValue

    जिसका अर्थ है "यदि objसंपत्ति है prop, तो इसे असाइन करें value, अन्यथा डिफ़ॉल्ट मान निर्दिष्ट करें defautValue"।

    कुछ लोग इस व्यवहार को भ्रामक मानते हैं, यह तर्क देते हुए कि यह कठिन-से-खोजने की त्रुटियों की ओर जाता है और inइसके बजाय ऑपरेटर का उपयोग करने की सलाह देता है

    value = ('prop' in obj) ? obj.prop : defaultValue

1
तब आप hasOwnProperty और प्रोटोटाइप के बारे में बात कर सकते थे। 'indexOf' []! == [] .hasOwnProperty ('indexOf')
Alsciende

1
हां, मैंने इसे जोड़ने के बारे में सोचा, लेकिन संक्षिप्तता के लिए पूर्णता का त्याग करने का फैसला किया। ;)
user187291

52
आप 0 और असत्य की समस्या को संबोधित नहीं करते हैं
TMS

12
आप अघोषित चर का मतलब है। एक वैरिएबल घोषित किया जा सकता है लेकिन फिर भी इसका एक मूल्य है undefined
TGR

1
और यह भी ध्यान दें कि typeofएक स्ट्रिंग लौटाता है। तो var myVar; typeof(myVar)==undefinedलौटता falseनहीं true
7

417

मुझे लगता है कि "मूल्य है nullया undefined" के लिए परीक्षण करने का सबसे कुशल तरीका है

if ( some_variable == null ){
  // some_variable is either null or undefined
}

तो ये दो पंक्तियाँ बराबर हैं:

if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}

नोट 1

जैसा कि प्रश्न में उल्लेख किया गया है, लघु संस्करण की आवश्यकता some_variableहै जिसे घोषित किया गया है, अन्यथा एक संदर्भError को फेंक दिया जाएगा। हालांकि कई उपयोग मामलों में आप मान सकते हैं कि यह सुरक्षित है:

वैकल्पिक तर्कों के लिए जाँच करें:

function(foo){
    if( foo == null ) {...}

किसी मौजूदा ऑब्जेक्ट पर गुणों की जाँच करें

if(my_obj.foo == null) {...}

दूसरी ओर typeofअघोषित वैश्विक चर (केवल रिटर्न undefined) से निपट सकते हैं । फिर भी इन मामलों को कम से कम अच्छे कारणों के लिए कम किया जाना चाहिए, जैसा कि अलसीसेंडे ने समझाया।

नोट 2

यह - और भी छोटा - भिन्न नहीं है:

if ( !some_variable ) {
  // some_variable is either null, undefined, 0, NaN, false, or an empty string
}

इसलिए

if ( some_variable ) {
  // we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}

नोट 3

सामान्य तौर पर इसके ===बजाय उपयोग करने की सिफारिश की जाती है ==। प्रस्तावित समाधान इस नियम का एक अपवाद है। JSHint वाक्य रचना चेकर भी प्रदान करता है eqnullइस कारण के लिए विकल्प।

से jQuery शैली गाइड :

सख्त समानता जांच (===) का उपयोग == के पक्ष में किया जाना चाहिए। एकमात्र अपवाद तब होता है जब अशक्त और अशक्त अशक्त के लिए जाँच कर रहा है।

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;

1
बहुत महत्वपूर्ण अंतर (जो पहले से ही प्रश्न btw में उल्लिखित था)। इसलिए सभी लोग टाइपोफ का उपयोग करते हैं। क्षमा करें, लेकिन मुझे यह नहीं मिलता कि आपका उत्तर कहां तक ​​उपयोगी है, आप सिर्फ उस प्रश्न के बारे में बताते हैं जो आपने कहा था और पहली कुछ पंक्तियों में आप इसे गलत भी कहते हैं।
TMS

33
क्षमा करें, लेकिन मुझे असहमत होना होगा; ;-) का उपयोग == nullकरने के लिए 'शून्य या अपरिभाषित' (जो प्रश्न विषय है) के लिए परीक्षण करने के लिए सबसे कुशल है। यह किसी भी तरह से असामान्य नहीं है (jQuery 1.9.1 में 43 बार उपयोग किया गया), क्योंकि बहुत बार आप जानते हैं कि चर घोषित किया गया था - या आप किसी मौजूदा ऑब्जेक्ट की संपत्ति के लिए परीक्षण करते हैं if( o.foo == null)
९'१३

1
@ mar10 (aUndefinedVar == null) आपको "aUndefinedVar परिभाषित नहीं है" त्रुटि सही नहीं है।
रन्नन

7
इस रसीले विकल्प के लिए धन्यवाद। मेरे कोड के 99% में अशक्त और अपरिभाषित के बीच अंतर करने की कोई आवश्यकता नहीं है, इसलिए इस चेक की संक्षिप्तता कम अव्यवस्थित कोड में परिणाम देती है।
इयान लवजॉय

1
किसी वैश्विक चर की जाँच करते समय संदर्भ संदर्भ को रोकने के लिए, का उपयोग करें window.someProperty == null। लेखन के बजाय: स्थानीय चर के लिए, आप आसानी से सुनिश्चित करें कि वे घोषित किये गए हैं कर सकते हैं if (...) {var local = ""}लिखनेvar local; if (...) { local = ""; }
Aloso

66

सामान्य समानता के साथ अशक्त की जाँच भी अपरिभाषित के लिए सच हो जाएगी।

if (window.variable == null) alert('variable is null or undefined');

जेएस समानता


4
ना ना ना ना के बराबर?
शारजील अहमद

2
@monotheist NaN, NaN ( MDN का NaN पृष्ठ देखें ) के बराबर नहीं है । जावास्क्रिप्ट उनके अस्थायी बिंदु के लिए IEEE-754 का उपयोग करता है जो इस व्यवहार को निर्दिष्ट करता है। इसके बारे में कुछ विचार हैं, देखें stackoverflow.com/a/23666623/2563765
स्टीवन

1
@ शार्जल अहम् यह गणितीय रूप से सही है। NaN
डिफरेंशियल

28

ईएस 5 और ईएस 6 जैसे नए जावास्क्रिप्ट मानकों में आप बस कह सकते हैं

> Boolean(0) //false
> Boolean(null)  //false
> Boolean(undefined) //false

सभी झूठे हैं, जो पाइथन के खाली चर के चेक के समान है। इसलिए यदि आप एक चर के चारों ओर सशर्त तर्क लिखना चाहते हैं, तो बस कहें

if (Boolean(myvar)){
   // Do something
}

यहाँ "अशक्त" या "खाली स्ट्रिंग" या "अपरिभाषित" को कुशलता से संभाला जाएगा।


2
समर्थन करने के लिए नीचे की तरह ie5, क्यों यह अधिक अच्छी तरह से ज्ञात नहीं है !?
13

12
ओपी केवल nullऔर के अलग परीक्षण करना चाहता था undefined, अन्य झूठे मूल्यों को सच लौटना चाहिए!
आंद्रे फिगयूरेडो

1
यह सशर्त में कोई मूल्य नहीं जोड़ता है। हालत बिल्कुल वैसा ही मूल्यांकन करता है और अभी भी 0, के लिए गलत है NaN। यह तब होता है जब आप किसी ऑब्जेक्ट की सच्चाई को बिना किसी ऑब्जेक्ट के रेफरेंस को कैप्चर करना चाहते हैं ताकि आप कुछ संभावित बड़ी ऑब्जेक्ट के बजाय उसे स्टोर कर सकें। FYI करना भी इसके बराबर है !!value, जो पहली !सच्चाई को नकारता है, और दूसरा इसे फिर से नकारता है।
erich2k8

> FYI करें यह भी !! मूल्य के बराबर है, जो पहले है! सच्चाई को नकारता है। कौन सा FYI भी बराबर है if (var)जो बूलियन को दिया जाएगा, इसलिए मूल रूप से पूरी तरह से बेकार ...
सिरिल चैपॉन

2
सचमुच का उपयोग करते समय कीवर्ड अपरिभाषित , Boolean(undefined)काम करता है, की कोशिश कर रहा है कि के साथ एक अपरिभाषित चर नहीं है काम, और कहा कि अशक्त या अपरिभाषित के लिए चेक कर के पूरे मुद्दे है। यह: if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }रेफरेंस को फेंकता है, यह कहते हुए कि "रेफ़रेंस: undeclareVarName परिभाषित नहीं है"
स्टीफन पी।

22

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

वस्तुओं के गुण समान स्थितियों के अधीन नहीं हैं। यदि किसी ऑब्जेक्ट प्रॉपर्टी को परिभाषित नहीं किया गया है, तो यदि आप कोशिश करते हैं और इसे एक्सेस करते हैं तो एक त्रुटि नहीं होगी। तो इस स्थिति में आप छोटा कर सकते हैं:

 if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)

सेवा

if (myObj.some_property != null)

इसे ध्यान में रखते हुए, और यह तथ्य कि वैश्विक चर वैश्विक वस्तु के गुणों के रूप में सुलभ हैं ( windowब्राउज़र के मामले में), आप वैश्विक चर के लिए निम्नलिखित का उपयोग कर सकते हैं:

if (window.some_variable != null) {
    // Do something with some_variable
}

स्थानीय स्कोपों ​​में, यह सुनिश्चित करने के लिए हमेशा उपयोगी होता है कि चर आपके कोड ब्लॉक के शीर्ष पर घोषित किए गए हैं, इससे पुनरावर्ती उपयोगों पर बचत होगी typeof


11
आपको NaN, 0, "" और गलत कारण याद होगा क्योंकि वे अशक्त नहीं हैं और न ही अपरिभाषित लेकिन झूठे भी हैं।
एंड्रियास कोबर्ले

@ ऑरंडस कॉबरेल सही है। यहां तक ​​कि गैर-सख्त समानता ऑपरेटर का कहना है कि नल NaN, 0, "", और झूठ से अलग है। आपको if (myObj.some_property != null)समान व्यवहार प्राप्त करने के लिए करना होगा।
thejoshwolfe

15

सबसे पहले आपको यह स्पष्ट करना होगा कि आप क्या परीक्षण करते हैं। जावास्क्रिप्ट में आपको यात्रा करने के लिए सभी प्रकार के निहितार्थ रूपांतरण हैं, और दो अलग-अलग प्रकार के समानता तुलनित्र हैं: ==और ===

एक फ़ंक्शन, test(val)जिसमें निम्नलिखित विशेषताएं होनी चाहिए nullया undefinedहोनी चाहिए:

 test(null)         => true
 test(undefined)    => true
 test(0)            => false
 test(1)            => false
 test(true)         => false
 test(false)        => false
 test('s')          => false
 test([])           => false

आइए देखें कि वास्तव में हमारे यहाँ कौन से विचार हैं।

ये काम:

val == null
val === null || val === undefined
typeof(val) == 'undefined' || val == null
typeof(val) === 'undefined' || val === null

ये काम नहीं करते हैं:

typeof(val) === 'undefined'
!!val

मैंने इन तरीकों की शुद्धता और प्रदर्शन की तुलना करने के लिए एक jsperf प्रविष्टि बनाई । परिणाम उस समय के लिए अनिर्णायक हैं क्योंकि विभिन्न ब्राउज़रों / प्लेटफार्मों पर पर्याप्त रन नहीं बने हैं। कृपया अपने कंप्यूटर पर परीक्षण चलाने के लिए एक मिनट का समय लें!

वर्तमान में, ऐसा लगता है कि सरल val == nullपरीक्षण सबसे अच्छा प्रदर्शन देता है। यह भी बहुत कम है। val != nullयदि आप पूरक चाहते हैं तो परीक्षण को नकारा जा सकता है ।


12

यह एकमात्र ऐसा मामला है जिसमें ==इसका उपयोग किया जाना चाहिए:

if (val == null) console.log('val is null or undefined')

3
इस उत्तर के 2019 के लगभग किया जा रहा upvotes की कमी है, लेकिन यह उपयोग के इस मामले KISS से एक है। इसके अलावा val != null, इसके विपरीत, बस एक = और @Yukulele के बाद से यह उपयोग करने के लिए केवल एक ही है जिसे ==आप जानते हैं कि जब आप इसे देखते हैं तो क्या होता है।
DKebler

7

चूंकि कोई एकल पूर्ण और सही उत्तर नहीं है, इसलिए मैं संक्षेप में बताने की कोशिश करूंगा:

सामान्य तौर पर, अभिव्यक्ति:

if (typeof(variable) != "undefined" && variable != null)

सरलीकृत नहीं किया जा सकता है, क्योंकि variableहो सकता है कि अघोषित रूप से चूकने के typeof(variable) != "undefined"परिणामस्वरूप ReferenceError हो। लेकिन, आप संदर्भ के अनुसार अभिव्यक्ति को सरल बना सकते हैं :

अगर variableहै वैश्विक , आप के लिए आसान बनाने में कर सकते हैं:

if (window.variable != null)

यदि यह स्थानीय है , तो आप संभवतः उन स्थितियों से बच सकते हैं जब यह चर अघोषित है, और इसके लिए सरल भी है:

if (variable != null)

यदि यह ऑब्जेक्ट प्रॉपर्टी है , तो आपको ReferenceError के बारे में चिंता करने की ज़रूरत नहीं है:

if (obj.property != null)

का navigatorहिस्सा है window? जब हमें इसके लिए अपवाद मिलता है navigator is not defined, तो क्या हम window.navigator != nullपरीक्षण का उपयोग कर सकते हैं ?
jww

5

आप बस यह जांच सकते हैं कि चर का मान है या नहीं। मतलब,

if( myVariable ) {
//mayVariable is not :
//null
//undefined
//NaN
//empty string ("")
//0
//false

}

यदि आप नहीं जानते कि क्या एक चर मौजूद है (इसका मतलब है, अगर यह घोषित किया गया था) तो आपको टाइपोफ़ ऑपरेटर से जांच करनी चाहिए। जैसे

if( typeof myVariable !== 'undefined' ) {
    // myVariable will get resolved and it is defined
}

4

मैंने इस विधि का उपयोग करके ऐसा किया है

आईडी को कुछ वेरिएबल में सेव करें

var someVariable = document.getElementById("someId");

अगर हालत का उपयोग करें

if(someVariable === ""){
 //logic
} else if(someVariable !== ""){
 //logic
}

3

जैसा कि एक उत्तर में उल्लेख किया गया है, आप भाग्य में हो सकते हैं यदि आप एक ऐसे चर के बारे में बात कर रहे हैं जिसमें वैश्विक गुंजाइश है। जैसा कि आप जानते होंगे, कि आप जिन चरों को विश्व स्तर पर परिभाषित करते हैं, वे विंडोज़ ऑब्जेक्ट में जुड़ जाते हैं। आप इस तथ्य का लाभ उठा सकते हैं ताकि आप कह सकें कि आप ब्लर नामक वैरिएबल का उपयोग कर रहे हैं, बस डबल इनवर्टेड ऑपरेटर (!!) का उपयोग करें।

!!window['bleh'];

यह तब तक एक गलत होगा जब ब्लोह घोषित नहीं किया गया है और एक मूल्य सौंपा गया है।


3

एरे का उपयोग करते हुए यहां एक और तरीका शामिल है () विधि:

[undefined, null].includes(value)

यह काम नहीं करता है! ReferenceError: मान परिभाषित नहीं किया गया है
Sébastien Temprado

1
यह वह मूल्य होना चाहिए जिसे आप जांचना चाहते हैं।
a2441918

2

जो कुछ भी yyy अपरिभाषित है या नल, यह सच वापस आ जाएगी

if (typeof yyy == 'undefined' || !yyy) {
    console.log('yes');
} else {
    console.log('no');
}

हाँ

if (!(typeof yyy == 'undefined' || !yyy)) {
    console.log('yes');
} else {
    console.log('no');
}

नहीं


2

अपने ब्राउज़र में डेवलपर टूल खोलें और नीचे दी गई छवि में दिखाए गए कोड को आज़माएं।

img1 Img2


2

समझने के लिए, आइए विश्लेषण करें कि अपरिभाषित, अशक्त और '' (एक रिक्त स्ट्रिंग भी) को परिवर्तित करते समय जावास्क्रिप्ट इंजन द्वारा मूल्य वापसी क्या होगी। आप सीधे अपने डेवलपर कंसोल पर समान देख सकते हैं।

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

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

if (a === undefined || a === null || a==='') {
    console.log("Nothing");
} else {
    console.log("Something");
}

इसके अलावा मैं एक बात और बताना चाहता हूं।

बुलियन (0) का परिणाम क्या होगा?

जरूर झूठा है। यह आपके कोड में एक बग बनाएगा जब 0 आपके अपेक्षित परिणाम में एक मान्य मूल्य होगा। तो कृपया यह सुनिश्चित करें कि जब आप कोड लिखते हैं तो आप इसके लिए जाँच करें।


2

आपके पास जैसा है, आप वैसा ही कर सकते हैं

if (some_variable === undefined || some_variable === null) { do stuff }


2

यह एक बहुत ही दुर्लभ अवसर का एक उदाहरण है जहां इसके ==बजाय उपयोग करने की सिफारिश की जाती है ===। अभिव्यक्ति और के somevar == nullलिए सही लौटेगी , लेकिन बाकी सब के लिए गलत है (एक त्रुटि अगर चर अघोषित है)।undefinednull

का उपयोग करते हुए !=उम्मीद के मुताबिक, परिणाम फ्लिप होगा।

आधुनिक संपादकों के साथ उपयोग करने ==या !=ऑपरेटर के लिए चेतावनी नहीं देंगे null, क्योंकि यह लगभग हमेशा वांछित व्यवहार है।

सबसे आम तुलना:

undeffinedVar == null     // true
obj.undefinedProp == null // true
null == null              // true
0 == null                 // false
'0' == null               // false
'' == null                // false

इसे स्वयं आज़माएं:

let undefinedVar;
console.table([
    { test : undefinedVar,     result: undefinedVar     == null },
    { test : {}.undefinedProp, result: {}.undefinedProp == null },
    { test : null,             result: null             == null },
    { test : false,            result: false            == null },
    { test : 0,                result: 0                == null },
    { test : '',               result: ''               == null },
    { test : '0',              result: '0'              == null },
]);

0

परीक्षण शून्यता ( if (value == null)) या गैर-शून्यता ( if (value != null)) एक चर की परिभाषा स्थिति का परीक्षण करने की तुलना में कम क्रिया है।

इसके अलावा, अपने चर (या वस्तु संपत्ति) के अस्तित्व को सुनिश्चित करने के लिए परीक्षण if (value)(या if( obj.property)) विफल रहता है अगर यह एक बूलियन falseमूल्य के साथ परिभाषित किया गया है । कैवेट एम्प्टर :)


0

दोनों मूल्यों को आसानी से सख्त तुलना ऑपरेटर के उपयोग से पहचाना जा सकता है:

पर काम कर उदाहरण:

http://www.thesstech.com/tryme?filename=nullandundefined

नमूना कोड:

function compare(){
    var a = null; //variable assigned null value
    var b;  // undefined
    if (a === b){
        document.write("a and b have same datatype.");
    }
    else{
        document.write("a and b have different datatype.");
    }   
}

0

यदि किसी वैरिएबल पर मान निर्दिष्ट करने से पहले यदि उस स्टेटमेंट का उद्देश्य nullया undefinedमानों की जांच करना है, तो आप Nullish Coalescing Operator का उपयोग कर सकते हैं , अंत में जावास्क्रिप्ट पर उपलब्ध है, हालांकि ब्राउज़र समर्थन सीमित है। कैनीयूज़ के डेटा के अनुसार , केवल 48.34% ब्राउज़र समर्थित हैं (अप्रैल 2020 तक)।

const a = some_variable ?? '';

यह सुनिश्चित करेगा कि चर खाली स्ट्रिंग (या किसी अन्य डिफ़ॉल्ट मान) को सौंपा जाएगा यदि some_variableहै nullया undefined

यह ऑपरेटर आपके उपयोग के मामले के लिए सबसे अनुकूल है, क्योंकि यह अन्य प्रकार के मिथ्या मूल्य जैसे 0और के लिए डिफ़ॉल्ट मान वापस नहीं करता है ''


-1

आपको इस फॉर्म के एक फंक्शन को परिभाषित करना होगा:

validate = function(some_variable){
    return(typeof(some_variable) != 'undefined' && some_variable != null)
}

यदि वैरिएबल अघोषित है तो यह एक ही ReferenceError उत्पन्न करेगा।
चाड

-1

ईएस 5 या ईएस 6 में यदि आपको कई बार इसकी जांच करने की आवश्यकता होती है, तो आप ऐसा करते हैं:

const excluded = [null, undefined, ''];

if (!exluded.includes(varToCheck) {
  // it will bee not null, not undefined and not void string
}


-1

रामदा के साथ, आप बस लोदाश कर सकते हैं R.isNil(yourValue) और अन्य सहायक पुस्तकालयों का कार्य समान है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.