जावास्क्रिप्ट अशक्त जाँच


170

मैं निम्नलिखित कोड भर में आया हूं:

function test(data) {
    if (data != null && data !== undefined) {
        // some code here
    }
}

मैं जावास्क्रिप्ट के लिए कुछ नया हूं, लेकिन, अन्य प्रश्नों से, जो मैं यहां पढ़ रहा हूं, मैं इस धारणा के तहत हूं कि यह कोड बहुत मायने नहीं रखता है।


विशेष रूप से, यह उत्तर बताता है कि

यदि आपको इसके अलावा किसी अन्य संदर्भ में अपरिभाषित चर का उपयोग करने पर त्रुटि मिलेगी typeof

अद्यतन: ऊपर दिए गए उत्तर का उद्धरण भ्रामक हो सकता है। इसे «अपरिभाषित चर» के बजाय «एक अघोषित चर» कहना चाहिए ।

जैसा कि मुझे पता चला, रेयान found , मैरिकिक्स और नेलनहोफ़ के जवाबों में , यहां तक ​​कि जब किसी फ़ंक्शन के लिए कोई तर्क प्रदान नहीं किया जाता है, तो तर्क के लिए इसके चर हमेशा घोषित होते हैं। यह तथ्य भी नीचे दी गई सूची में पहले आइटम को गलत साबित करता है।


मेरी समझ से, निम्नलिखित परिदृश्यों का अनुभव किया जा सकता है:

  • फ़ंक्शन को बिना किसी तर्क के बुलाया गया था, इस प्रकार dataएक अपरिभाषित चर बनाते हुए , और एक त्रुटि को बढ़ाते हुए data != null

  • फ़ंक्शन को विशेष रूप से null(या undefined) इसके तर्क के रूप में कहा जाता था , जो मामले में data != nullपहले से ही आंतरिक कोड की रक्षा करता है, && data !== undefinedबेकार प्रतिपादन करता है ।

  • फ़ंक्शन को एक गैर-शून्य तर्क के साथ बुलाया गया था, जिस स्थिति में यह तुच्छ रूप से दोनों को पारित करेगा data != null और data !== undefined

प्रश्न: क्या मेरी समझ सही है?


मैंने फ़ायरफ़ॉक्स के कंसोल में निम्नलिखित कोशिश की है:

--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true

मैं एक ऐसे मामले का पता नहीं लगा सकता जहाँ data !== undefined बाद data != null में किसी काम का हो।


9
बस उपयोग करें if (data)। यह जाँचने का जावास्क्रिप्ट तरीका है कि dataचर सही का मूल्यांकन करता है या नहीं। undefined, nullझूठी, 0, खाली स्ट्रिंग, खाली सरणी और (?) कोई गुण नहीं है जिसके साथ कोई गुण गलत का मूल्यांकन नहीं करता है, बाकी सच है।
J0HN

20
@ J0HN - का उपयोग करने if(data)का अर्थ यह होगा कि वह पास नहीं कर सकता falseया इसके 0लिए मान के रूप में नहीं data
techfoobar

@ J0HN इसके अलावा, मेरे द्वारा बताए गए एक ही उत्तर में यह भी कहा गया है: if(typeof someUndefVar == whatever) -- worksऔर if(someUnderVar) -- error
afsantos

2
यह शायद माना जाता है data !== null && data !== undefined, data != nullजो इसके बराबर है data != undefined। पूर्व प्रपत्र को पसंदीदा माना जाता है क्योंकि यह शर्तों के बारे में अधिक स्पष्ट है, जबकि यह अनदेखी करना आसान होगा कि दोनों को nullऔर undefinedबाद की दो स्थितियों के साथ जाँच की जा रही है।
zzzzBov

2
वैसे, undefinedआईएमओ एक कोड गंध के लिए स्पष्ट परीक्षण हैं। यह एक संरक्षित कीवर्ड नहीं है null, यह एक ऐसा वेरिएबल है जो अपरिभाषित होता है। यह पूरी तरह से वैध है और आपके कोड को तोड़ने वाला है:undefined = 1
इज़्काटा

जवाबों:


106

एक "अपरिभाषित चर" मूल्य से अलग है undefined

अपरिभाषित चर:

var a;
alert(b); // ReferenceError: b is not defined

मूल्य के साथ एक चर undefined:

var a;
alert(a); // Alerts “undefined”

जब कोई फ़ंक्शन एक तर्क लेता है, तो उस तर्क को हमेशा घोषित किया जाता है भले ही उसका मूल्य हो undefined, और इसलिए कोई त्रुटि नहीं होगी। हालांकि आप बेकार हैं, हालांकि != nullइसके बारे में आप सही हैं !== undefined


32
data !== null && data !== undefinedहालांकि समझदारी होगी।
bfavaretto

@bfavaretto: हां, तो यह वास्तव में एक टाइपो हो सकता है। लेकिन तुम कभी पता नहीं ...: डी
Ry-

1
जैसा मैंने सोचा था, स्पष्टीकरण के लिए धन्यवाद। इसके अलावा, मुझे नहीं लगता कि यह एक टाइपो है। मैंने पूरी स्क्रिप्ट में फ़ाइंड-एंड-काउंट चलाया है , और इसमें 10 घटनाएँ मिलीं, इसलिए ... मुझे लगता है कि लेखक को इस पर स्पष्टीकरण भी चाहिए।
afsantos

2
ऊपर मेरी टिप्पणी को स्क्रैच करें: वास्तव में, data != nullदोनों के लिए जांच करेगा nullऔर undefined(लेकिन, दिलचस्प रूप से, सिर्फ nullऔर के लिए undefined, और अन्य झूठे मूल्यों के लिए नहीं)।
bfavaretto

90

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

var a = null;
alert(a === null); // true

जैसा कि @rynah उल्लेख करता है, "अपरिभाषित" जावास्क्रिप्ट में थोड़ा भ्रमित है। हालाँकि, यह हमेशा परीक्षण करना सुरक्षित typeof(x)है कि क्या स्ट्रिंग "अपरिभाषित" है, भले ही "x" एक घोषित चर नहीं है:

alert(typeof(x) === 'undefined'); // true

इसके अलावा, चर का "अपरिभाषित मूल्य" हो सकता है यदि वे आरंभिक नहीं हैं:

var y;
alert(typeof(y) === 'undefined'); // true

यह सब एक साथ रखकर, आपका चेक इस तरह दिखना चाहिए:

if ((typeof(data) !== 'undefined') && (data !== null)) {
  // ...

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

function(data) {
  if ((data !== undefined) && (data !== null)) {
    // ...

यह कहने के लिए स्निपेट "यदि फ़ंक्शन को एक तर्क के साथ बुलाया गया था, जो परिभाषित है और अशक्त नहीं है ..."


5
हालांकि यह ऐसा क्यों दिखना चाहिए ? != nullको छोड़कर सभी मूल्यों के लिए सच हो जाएगा nullऔर undefined, और हम यह सुनिश्चित करें कि इस चर घोषित किया जाता है कर रहे हैं। typeofअन्य स्थितियों में भी खतरनाक हो सकता है - क्या होगा यदि आप चर नाम को गलत मानते हैं? कोई त्रुटि नहीं होने के कारण यह लंबे समय तक चल सकता है।
Ry-

@मैरिकिक्स तो, अगर मैंने आपके उत्तर का सही ढंग से पालन किया, तो उपरोक्त परिदृश्य की तरह एक अशक्त जांच में, आप बिल्कुल भी उपयोग नहीं करेंगे !=, केवल सख्त तुलना !==,?
अफसांतोस

@rynah: मैं ओपी के समग्र समाधान के बारे में जानने के लिए पर्याप्त नहीं हूं यह जानने के लिए कि एक अशक्त परीक्षण उपयुक्त है या नहीं, लेकिन मैंने इस तथ्य का उल्लेख करने के लिए संपादित किया कि "टाइपोफ़" का उपयोग करना अनावश्यक है।
मैरिकिक्स

@afsantos: वास्तव में मुझे नहीं लगता कि कई (किसी भी?) मूल्य शून्य में बदल जाएंगे; हालाँकि, ===जब तक आप वास्तव में क्या कर रहे हैं और रूपांतरण के बाद तुलना करना चाहते हैं , यह तब तक पता होना चाहिए जब तक आप वास्तव में नहीं जानते हैं, तो कड़े तुलना ( ) का उपयोग करना सबसे अच्छा अभ्यास है ==
मैरिकिक्स

1
@ इज़काटा: किसी भी पुस्तकालय को छोड़ दें जो पुन: परिभाषित करने का प्रयास करता है undefined। इसके अलावा, iPad पर Safari किसी भी परिस्थिति में ऐसा नहीं करेगा। आप भी नहीं कर सकते delete window.undefined
Ry-

10

आपके मामले में उपयोग data==null(जो केवल अशक्त और अपरिभाषित के लिए सत्य है - पंक्तियों / स्तंभों पर दूसरे चित्र पर ध्यान केंद्रित करें-अपरिभाषित)

यहाँ आपके पास सभी ( src ) हैं:

अगर

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

== (इसकी उपेक्षा ! = )

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

=== (इसकी उपेक्षा ! == )

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


8

प्रश्न: फ़ंक्शन को बिना किसी तर्क के साथ बुलाया गया था, इस प्रकार डेटा को एक अपरिभाषित चर बना दिया गया, और डेटा पर एक त्रुटि बढ़ गई! = Null।

एक: हाँ, dataअपरिभाषित करने के लिए सेट किया जाएगा। अनुभाग 10.5 देखें। घोषणा के बंधन पर विचार । लेकिन अपरिभाषित मूल्य तक पहुँचने में त्रुटि नहीं होती है। आप शायद इसे सख्त मोड में एक अघोषित चर तक पहुंचने के साथ भ्रमित कर रहे हैं जो एक त्रुटि उठाता है।

प्रश्न: फ़ंक्शन को विशेष रूप से अशक्त (या अपरिभाषित) के साथ बुलाया गया था, इसके तर्क के रूप में, जिस स्थिति में डेटा! = Null पहले से ही आंतरिक कोड की सुरक्षा करता है, प्रतिपादन && डेटा! == अपरिभाषित बेकार।

प्रश्न: फ़ंक्शन को एक गैर-अशक्त तर्क के साथ बुलाया गया था, जिस स्थिति में यह तुच्छ रूप से दोनों डेटा पास करेगा! = अशक्त और डेटा! == अपरिभाषित।

A: सही है। ध्यान दें कि निम्नलिखित परीक्षण समतुल्य हैं:

data != null
data != undefined
data !== null && data !== undefined

देखें अनुभाग 11.9.3 सार समानता की तुलना एल्गोरिथ्म और अनुभाग 11.9.6 सख्त समानता की तुलना युक्ति के एल्गोरिथ्म


मैं अघोषित चर के साथ भ्रमित नहीं था, मुझे वास्तव में नहीं पता था कि जब कोई तर्क प्रदान नहीं किया गया था तो यह कैसे काम करता है। मुझे यकीन था कि dataसेट होने के बजाय यह बिल्कुल भी मौजूद नहीं होगा undefined। मैं स्पष्टीकरण की सराहना करता हूं, और उन संदर्भों ने मुझे बेहतर तरीके से समझने में मदद की कि दोनों समानताएं कैसे काम करती हैं।
अफसांतोस

3

मुझे लगता है, जिन मूल्यों की आप अपेक्षा नहीं करते हैं उनके लिए चर का परीक्षण करना सामान्य तौर पर अच्छा विचार नहीं है। क्योंकि आपके परीक्षण के रूप में आप निषिद्ध मूल्यों की एक ब्लैकलिस्ट लिखने के रूप में विचार कर सकते हैं। लेकिन क्या होगा अगर आप सभी निषिद्ध मूल्यों को सूचीबद्ध करना भूल जाते हैं? कोई, यहां तक ​​कि आप, एक अप्रत्याशित मूल्य पारित करने के साथ अपने कोड को क्रैक कर सकते हैं। तो एक अधिक उपयुक्त दृष्टिकोण कुछ ऐसा है जैसे कि वाइटेलिस्टिंग - परीक्षण चर केवल अपेक्षित मूल्यों के लिए, अप्रत्याशित नहीं। उदाहरण के लिए, यदि आप इसके बजाय डेटा मान को एक स्ट्रिंग होने की उम्मीद करते हैं:

function (data) {
  if (data != null && data !== undefined) {
    // some code here
    // but what if data === false?
    // or data === '' - empty string?
  }
}

कुछ इस तरह से करें:

function (data) {
  if (typeof data === 'string' && data.length) {
    // consume string here, it is here for sure
    // cleaner, it is obvious what type you expect
    // safer, less error prone due to implicit coercion
  } 
}

2

typeof foo === "undefined"से अलग है foo === undefined, उन्हें कभी भ्रमित न करें। typeof foo === "undefined"वास्तव में आपको क्या चाहिए। इसके अलावा, के !==स्थान पर उपयोग करें!=

तो बयान के रूप में लिखा जा सकता है

function (data) {
  if (typeof data !== "undefined" && data !== null) {
    // some code here
  }
}

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

आप foo === undefinedअघोषित चर के लिए उपयोग नहीं कर सकते ।

var t1;

if(typeof t1 === "undefined")
{
  alert("cp1");
}

if(t1 === undefined)
{
  alert("cp2");
}

if(typeof t2 === "undefined")
{
  alert("cp3");
}

if(t2 === undefined) // fails as t2 is never declared
{
  alert("cp4");
}

1
ठीक है, लेकिन इस मामले में चर घोषित किया गया है, तो मुद्दा क्या है?
Ry-

व्यक्तिगत रूप से, मुझे foo === undefinedउपयोग करने के लिए खतरनाक लगता है। यह आपके कोड को उसी स्थिति के लिए विफल बनाता है जिसे आप रोकने की कोशिश कर रहे थे।

मैं सवाल में फ़ंक्शन के तर्क के बारे में बात कर रहा हूं। मेरी अन्य टिप्पणी भी देखें ।
Ry-

1
ऐसा क्यों किया जा रहा है? बहुत पहला वाक्य एक सही और महत्वपूर्ण अंतर है!
इज़्काता

1
@ इज़काटा: क्योंकि प्रारंभिक विवरण के लिए कोई स्पष्टीकरण नहीं है। foo === undefinedओपी की स्थिति में पूरी तरह से स्वीकार्य है (यह मानते हुए अति undefinedनहीं किया गया है)। उत्तर यह समझाने में भी विफल रहता है कि !== इसका उपयोग क्यों किया जाना चाहिए !=
मैट

1

आपकी परीक्षा करने का सरल तरीका है:

function (data) {
    if (data) { // check if null, undefined, empty ...
        // some code here
    }
}

5
क्या यह परीक्षण संदर्भ-निर्भर नहीं है? मेरा मतलब है, यदि अपेक्षित प्रकार dataएक स्ट्रिंग है, तो यह परीक्षण खाली स्ट्रिंग्स पर गलत है, जो उचित हो सकता है या नहीं, (उपयुक्त हो सकता है कि फ़ंक्शन खाली स्ट्रिंग से किसी तरह से निपटना चाहता है)।
अफसानोस

5
सिवाय इसके कि यदि "डेटा" का मूल्य है ""या 0या NaN(या अन्य) "यदि" ब्लॉक को छोड़ दिया जाएगा; जो ओपी की मंशा हो भी सकती है और नहीं भी।
मैरिकिक्स

क्षमा करें @afsantos, मैंने आपकी टिप्पणी नहीं देखी, यदि आप डेटा के अपरिभाषित होने पर गलत निकलना चाहते हैं, तो अशक्त ... सिवाय इसके कि जब तारीख खाली हो, तो आपको एक अन्य var toest + data बनाने की आवश्यकता होगी ; पहले एक के बाद एक अन्य परीक्षण के साथ: अगर (toTest == "") {// कुछ कोड यहाँ}
कादिरी

-5
var a;
alert(a); //Value is undefined

var b = "Volvo"; 
alert(b); //Value is Volvo

var c = null;
alert(c); //Value is null

4
कृपया कुछ स्पष्टीकरण जोड़ें कि इसका क्या मतलब है।
Ry-

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