यदि जावास्क्रिप्ट में कोई ऑब्जेक्ट प्रॉपर्टी है, तो जाँच का सबसे अच्छा तरीका क्या है undefined
?
यदि जावास्क्रिप्ट में कोई ऑब्जेक्ट प्रॉपर्टी है, तो जाँच का सबसे अच्छा तरीका क्या है undefined
?
जवाबों:
यह जांचने का सामान्य तरीका है कि किसी संपत्ति का मूल्य विशेष मूल्य 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`");
}
obj !== undefined
हैं। undefined
इसका उपयोग करने योग्य था, जैसे undefined = 1234
कि दिलचस्प परिणाम क्या होगा। लेकिन एक्मास्क्रिप्ट 5 के बाद, यह अब लिखने योग्य नहीं है, इसलिए हम सरल संस्करण का उपयोग कर सकते हैं। सांकेतिकता.com
मेरा मानना है कि इस विषय में कई गलत उत्तर हैं। आम धारणा के विपरीत, "अपरिभाषित" जावास्क्रिप्ट में एक कीवर्ड नहीं है और वास्तव में इसके लिए एक मूल्य निर्धारित किया जा सकता है।
इस परीक्षण को करने का सबसे मजबूत तरीका है:
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 अघोषित है।
=== undefined
लगाता हूँ, जो बेजुबान का उपयोग नहीं करने के लिए दिया गया है । हां, आप इसे असाइन कर सकते हैं undefined
, लेकिन ऐसा करने का कोई वैध कारण नहीं है, और यह अनुमान है कि ऐसा करने से आपका कोड टूट सकता है। C में आप #define true false
और Python में आप को असाइन कर सकते हैं True
और False
, लेकिन लोग अपने कोड को उन भाषाओं में इस तरह से डिजाइन करने की आवश्यकता महसूस नहीं करते हैं जैसे कि खुद की संभावना के विरुद्ध रक्षा करने के लिए जानबूझकर अपने स्वयं के वातावरण को कोड में कहीं और तोड़फोड़ करते हैं। । undefined
यहाँ पर भी ध्यान देने योग्य होने की संभावना क्यों है ?
void 0
उस मूल्य को प्राप्त करने के लिए कर सकते हैं जो undefined
इंगित करता है। तो आप कर सकते हैं if (myVar === void 0)
। 0
विशेष नहीं है, आप सचमुच वहाँ किसी भी अभिव्यक्ति डाल सकते हैं।
यहाँ कई अन्य उत्तरों द्वारा सिफारिश किए जाने के बावजूद, 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
इसका उपयोग क्यों कर रहे हैं , क्योंकि यह ===
समानता के लिए जांच करने के लिए उपयोग करने के लिए सबसे अधिक समझ में आता है , क्योंकि इसे बाद में एक चर के मूल्य की जांच करने के लिए फिर से तैयार किया जा सकता है, और क्योंकि यह सिर्फ सादा है बेहतर लग रहा है, आपको हमेशा === undefined
as यहां भी उपयोग करना चाहिए ।
ऑब्जेक्ट गुण की बात आने पर विचार करने के लिए कुछ और है कि क्या आप वास्तव undefined
में सभी के लिए जांचना चाहते हैं । किसी दी गई संपत्ति का नाम किसी वस्तु पर अनुपस्थित हो सकता है ( undefined
जब पढ़ा जाता है तो मान पैदा करता है ), मूल्य के साथ वस्तु पर ही undefined
मौजूद होता है, मूल्य के साथ वस्तु के प्रोटोटाइप undefined
पर मौजूद होता है, या गैर- undefined
मूल्य वाले लोगों में से किसी पर भी मौजूद होता है । 'key' in obj
आपको बताएगा कि क्या एक वस्तु के प्रोटोटाइप चेन पर कहीं भी एक कुंजी है, और Object.prototype.hasOwnProperty.call(obj, 'key')
आपको बताएगा कि क्या यह सीधे ऑब्जेक्ट पर है। मैं इस उत्तर में प्रोटोटाइप के बारे में विस्तार से नहीं जाऊँगा और वस्तुओं को स्ट्रिंग-की-मैप के रूप में उपयोग कर रहा हूँ, हालाँकि, यह ज्यादातर मूल प्रश्न के संभावित व्याख्याओं के बावजूद अन्य सभी खराब सलाह का सामना करने के लिए है। इस पर पढ़ेअधिक के लिए एमडीएन पर वस्तु प्रोटोटाइप !
उदाहरण चर नाम की असामान्य पसंद? यह फ़ायरफ़ॉक्स के लिए NoScript एक्सटेंशन से वास्तविक मृत कोड है।
Not यह मत समझो कि न जाने क्या-क्या गुंजाइश है, सामान्य रूप से ठीक है, हालांकि। डायनेमिक स्कोप के दुरुपयोग के कारण बोनस भेद्यता: प्रोजेक्ट जीरो 1225
again एक बार फिर ईएस 5 + वातावरण मान रहा है और यह वैश्विक वस्तु undefined
की undefined
संपत्ति को संदर्भित करता है । स्थानापन्न void 0
अन्यथा।
undefined
छिपाते हुए, अपने स्वयं को परिभाषित कर सकता है । जो अधिकांश व्यावहारिक उद्देश्यों के लिए होता है, उसका प्रभाव उतना ही अधिक होता है।
void 0
अपरिभाषित के खिलाफ तुलना करने के लिए उपयोग कर सकते हैं लेकिन फिर से - यह मूर्खतापूर्ण और ओवरकिल है।
typeof something === "undefined")
में कोड में देखना बंद करना चाहता हूं ।
void 0
(एक बार के लिए) दोनों छोटे और सुरक्षित हैं! यह मेरी किताब में एक जीत है।
जावास्क्रिप्ट में अशक्त है और अपरिभाषित है । उनके अलग-अलग अर्थ हैं।
मेरीजन हवेर्बेके ने कहा, उनकी मुफ्त पुस्तक " एलोक्वेंट जावास्क्रिप्ट " (जोर मेरा) में:
एक समान मूल्य भी है, अशक्त, जिसका अर्थ है 'यह मान परिभाषित है, लेकिन इसका कोई मूल्य नहीं है'। अपरिभाषित और अशक्त के बीच अर्थ में अंतर ज्यादातर अकादमिक है, और आमतौर पर बहुत दिलचस्प नहीं है। व्यावहारिक कार्यक्रमों में, अक्सर यह जांचना आवश्यक होता है कि क्या किसी चीज का 'मूल्य' है। इन मामलों में, अभिव्यक्ति कुछ == अपरिभाषित का उपयोग किया जा सकता है, क्योंकि, भले ही वे बिल्कुल समान मूल्य नहीं हैं, अशक्त == अपरिभाषित सत्य का उत्पादन करेंगे।
इसलिए, मुझे लगता है कि अगर कुछ अपरिभाषित होगा तो जांचने का सबसे अच्छा तरीका है:
if (something == undefined)
उम्मीद है की यह मदद करेगा!
संपादित करें: आपके संपादन के जवाब में, ऑब्जेक्ट गुण उसी तरह काम करना चाहिए।
var person = {
name: "John",
age: 28,
sex: "male"
};
alert(person.name); // "John"
alert(person.fakeVariable); // undefined
undefined
केवल एक चर है जिसे उपयोगकर्ता द्वारा फिर से असाइन किया जा सकता है: लेखन undefined = 'a';
आपके कोड को अब वह नहीं करेगा जो आपको लगता है कि यह करता है। उपयोग करना typeof
बेहतर है और यह चर (केवल गुण नहीं) के लिए भी काम करता है जिसे घोषित नहीं किया गया है।
इसका क्या अर्थ है: "अपरिभाषित वस्तु संपत्ति" ?
वास्तव में यह दो काफी अलग चीजों का मतलब हो सकता है! पहला, इसका मतलब उस संपत्ति से हो सकता है जिसे कभी वस्तु में परिभाषित नहीं किया गया है और दूसरा, इसका मतलब यह हो सकता है कि उस संपत्ति का अपरिभाषित मूल्य है । आइए इस कोड को देखें:
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.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
(इसे 'वैश्विक' उपसर्ग के बिना भी इस्तेमाल किया जा सकता है)। मैं सर्वर-साइड जावास्क्रिप्ट के अन्य कार्यान्वयन के बारे में नहीं जानता।
undefined
सदस्य के रूप में इसके बारे में कुछ नहीं कहता है global
। इसके अलावा और न console.log(global);
ही वैश्विक के एक सदस्य के रूप में अपरिभाषितfor (var key in global) { ... }
नहीं दिखाता है । लेकिन परीक्षण इसके विपरीत दिखाते हैं। 'undefined' in global
[[Enumerable]]
यह गलत है :-)
Minuses of typeof obj.prop == 'undefined'
इस संबंध में , इसे लिखने से बचा जा सकता है typeof obj.prop == typeof undefined
। यह भी एक बहुत अच्छा समरूपता देता है।
obj.prop === undefined
।
if ('foo' in o
) ... आपका जवाब सही मायने में है पहले सही जवाब यहाँ। बहुत ज्यादा हर कोई बस उस वाक्य का जवाब देता है।
मुद्दा तीन मामलों में उबलता है:
undefined
।undefined
।यह हमें कुछ महत्वपूर्ण मानता है:
अपरिभाषित मान और अपरिभाषित मान के साथ परिभाषित सदस्य के बीच अंतर होता है।
लेकिन नाखुशी 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); }
लेकिन जैसा कि उल्लेख किया गया है ये बिल्कुल समान नहीं हैं (लेकिन मेरी जरूरतों के लिए पर्याप्त से अधिक हैं)।
if (!("x" in blob)) {}
चारों ओर कोष्ठक के साथ कहना है, क्योंकि! ऑपरेटर में 'इन' से अधिक पूर्वता है। आशा है कि किसी की मदद करता है।
a = {b: undefined}
; तो typeof a.b === typeof a.c === 'undefined'
लेकिन 'b' in a
और !('c' in a)
।
{ x : undefined }
या कम से कम इसे दूसरे विकल्प के रूप में जोड़ दूंगा (2.) तालिका में - मुझे उस बिंदु का एहसास करने के लिए एक पल के लिए सोचना था (2.) का मूल्यांकन undefined
(हालांकि आप उल्लेख करते हैं कि बाद में)।
if ( typeof( something ) == "undefined")
यह मेरे लिए काम किया, जबकि दूसरों ने नहीं किया।
typeof (something == "undefined")
।
(typeof something) === "undefined"
।
मुझे यकीन नहीं है कि इसके ===
साथ उपयोग करने का मूल कहां 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
==
अभी भी आवश्यकता है कम से कम एक प्रकार की जांच - दुभाषिया उनके प्रकार पहले जानने के बिना दो ऑपरेंड तुलना नहीं कर सकते।
==
की तुलना में एक कम चरित्र है ===
:)
संबंधित प्रश्न से मेरे उत्तर को क्रॉसपोस्ट करना जावास्क्रिप्ट में "अपरिभाषित" की जांच कैसे करें?
इस प्रश्न के लिए, के साथ परीक्षण मामलों को देखें 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
यदि तुम करो
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)
मैंने नहीं देखा (आशा है कि मुझे यह याद नहीं है) किसी ने संपत्ति से पहले वस्तु की जांच की। तो, यह सबसे छोटा और सबसे प्रभावी है (हालांकि जरूरी नहीं कि सबसे स्पष्ट):
if (obj && obj.prop) {
// Do something;
}
यदि obj या obj.prop अपरिभाषित, अशक्त, या "मिथ्या" है, तो यदि कथन कोड ब्लॉक को निष्पादित नहीं करेगा। यह आमतौर पर अधिकांश कोड ब्लॉक स्टेटमेंट (जावास्क्रिप्ट में) में वांछित व्यवहार है।
var x = obj && obj.prop || 'default';
लेख में नाले के रसातल और अपरिभाषित जावास्क्रिप्ट में मैंने पढ़ा कि अंडरस्कोर।जैसे फ्रेमवर्क इस फ़ंक्शन का उपयोग करते हैं:
function isUndefined(obj){
return obj === void 0;
}
void 0
लेखन का सिर्फ एक छोटा तरीका है undefined
(क्योंकि जो किसी भी अभिव्यक्ति के बाद शून्य है), यह 3 वर्णक बचाता है। यह भी कर सकता है var a; return obj === a;
, लेकिन यह एक और चरित्र है। :-)
void
एक आरक्षित शब्द है, जबकि डिफ़ॉल्ट रूप से बराबर undefined
नहीं है , जबकि आप उदाहरण के लिए एक मान प्रदान कर सकते हैं । undefined
void 0
undefined
undefined = 1234
isUndefined(obj)
: 16 वर्ण। obj === void 0
: 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`)
}
और> यहाँ
सबसे अधिक संभावना है कि आप चाहते हैं if (window.x)
। यह जाँच सुरक्षित है भले ही x घोषित नहीं किया गया हो ( var x;
) - ब्राउज़र कोई त्रुटि नहीं देता है।
if (window.history) {
history.call_some_function();
}
विंडो एक ऐसी वस्तु है जो सभी वैश्विक चर को अपने सदस्यों के रूप में रखती है, और गैर-मौजूदा सदस्य तक पहुंचने की कोशिश करना कानूनी है। यदि एक्स घोषित नहीं किया गया है या सेट नहीं किया गया तो window.x
रिटर्न अपरिभाषित । अपरिभाषित पर ले जाया जाता झूठी जब यदि () यह मूल्यांकन करता है।
typeof history != 'undefined'
वास्तव में दोनों प्रणालियों में काम करता है।
इसके माध्यम से पढ़ना, मुझे आश्चर्य है कि मैंने यह नहीं देखा। मुझे कई एल्गोरिदम मिले हैं जो इसके लिए काम करेंगे।
यदि किसी वस्तु के मूल्य को कभी परिभाषित नहीं किया गया था, 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");
}
if (!obj.prop)
var obj = {foo: undefined}; obj.foo === void 0
-> true
। यह कैसे "कभी नहीं के रूप में परिभाषित किया गया है undefined
"? ये गलत है।
के साथ तुलना करें void 0
, मरोड़ के लिए।
if (foo !== void 0)
यह क्रिया के रूप में नहीं है if (typeof foo !== 'undefined')
foo
अघोषित होने पर यह एक रेफरेंस फेंक देगा ।
समाधान गलत है। जावास्क्रिप्ट में,
null == undefined
सच लौटेगा, क्योंकि वे दोनों एक बूलियन के लिए "कास्ट" हैं और झूठे हैं। सही तरीके से जांच होगी
if (something === undefined)
जो पहचान ऑपरेटर है ...
===
प्रकार समानता है + (आदिम समानता। वस्तु पहचान), जहां आदिम में तार शामिल हैं। मुझे लगता है कि 'abab'.slice(0,2) === 'abab'.slice(2)
अगर कोई पहचानकर्ता के ===
रूप में मानता है तो ज्यादातर लोग अनजाने में विचार करते हैं।
आप निम्न कोड का उपयोग करके पथ के साथ सभी को अपरिभाषित कर सकते हैं।
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
।
यहाँ मेरी स्थिति है:
मैं एक रिस्ट कॉल के परिणाम का उपयोग कर रहा हूं। परिणाम JSON से जावास्क्रिप्ट ऑब्जेक्ट पर पार्स किया जाना चाहिए।
एक त्रुटि है जिसका मुझे बचाव करने की आवश्यकता है। यदि शेष कॉल के लिए args गलत था, जहाँ तक उपयोगकर्ता args को गलत बताता है, तो शेष कॉल मूल रूप से खाली आता है।
इस पोस्ट का उपयोग करते हुए मुझे इससे बचाव करने में मदद करने के लिए, मैंने यह कोशिश की।
if( typeof restResult.data[0] === "undefined" ) { throw "Some error"; }
मेरी स्थिति के लिए, अगर restResult.data [0] === "ऑब्जेक्ट", तो मैं सुरक्षित रूप से बाकी सदस्यों का निरीक्षण करना शुरू कर सकता हूं। यदि अपरिभाषित है तो त्रुटि को ऊपर के रूप में फेंक दें।
मैं यह कह रहा हूं कि मेरी स्थिति के लिए, इस पोस्ट में ऊपर दिए गए सभी सुझाव काम नहीं आए। मैं यह नहीं कह रहा कि मैं सही हूं और हर कोई गलत है। मैं एक जावास्क्रिप्ट मास्टर बिल्कुल नहीं हूँ, लेकिन उम्मीद है कि यह किसी की मदद करेगा।
typeof
गार्ड वास्तव में किसी भी चीज़ की रक्षा नहीं करता है जो एक सीधी तुलना नहीं कर सकता है। यदि restResult
अनिर्धारित या अघोषित है, तो यह अभी भी फेंक देगा।
if(!restResult.data.length) { throw "Some error"; }
एक परिभाषित चर को परिभाषित करने के लिए एक अच्छा और सुरुचिपूर्ण तरीका है यदि इसे परिभाषित किया जाता है या इसे एक डिफ़ॉल्ट मान के रूप में असाइन किया जाता है यदि यह अपरिभाषित है।
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
सभी उत्तर अपूर्ण हैं। यह जानने का सही तरीका है कि कोई संपत्ति 'अपरिभाषित के रूप में परिभाषित' है:
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
टिप्पणियों के माध्यम से जाना, उन लोगों के लिए जो दोनों को जांचना चाहते हैं क्या यह अपरिभाषित है या इसका मूल्य शून्य है:
//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;
यदि आप कोणीय का उपयोग कर रहे हैं:
angular.isUndefined(obj)
angular.isUndefined(obj.prop)
Underscore.js:
_.isUndefined(obj)
_.isUndefined(obj.prop)
1
चर में कैसे जोड़ूँ x
? क्या मुझे अंडरस्कोर या jQuery की आवश्यकता है? (आश्चर्यजनक है कि लोग पुस्तकालयों का उपयोग यहां तक कि सबसे प्राथमिक कार्यों जैसे कि typeof
चेक के लिए भी करेंगे )
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
अपरिभाषित है और इसे आरंभीकरण के बाद परिभाषित किया गया है।
मैं अजीब जवाब की उम्मीद करने वालों के लिए यहां तीन तरीके प्रदान करता हूं:
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);
इनपुट मान की संपत्ति प्राप्त करने का प्रयास करें, यदि मौजूद है तो त्रुटि संदेश की जांच करें। यदि इनपुट मान अपरिभाषित है, तो त्रुटि संदेश होगा अनपेक्षित टाइप : अपरिभाषित की संपत्ति 'बी' को नहीं पढ़ा जा सकता है
तुलना करने के लिए इनपुट मान को स्ट्रिंग में बदलें "undefined"
और यह सुनिश्चित करें कि यह नकारात्मक मूल्य है।
Js में, वैकल्पिक पैरामीटर तब काम करता है जब इनपुट वैल्यू बिल्कुल होती है undefined
।
function isUnset(inp) {
return (typeof inp === 'undefined')
}
यदि चर सेट है, और यदि अपरिभाषित है तो सही है।
फिर उपयोग करें:
if (isUnset(var)) {
// initialize variable here
}
typeof
से एक फ़ंक्शन में परीक्षण लपेट नहीं सकते । कमाल यह कि 4 लोगों ने इसे उखाड़ फेंका। -1।
मैं आपको undefined
वैरिएबल की सुरक्षा के लिए कुछ ऐसा दिखाना चाहूंगा जिसका उपयोग मैं कर रहा हूं :
Object.defineProperty(window, 'undefined', {});
यह window.undefined
मान बदलने के लिए किसी को भी मना करता है इसलिए उस चर के आधार पर कोड को नष्ट करना। यदि उपयोग किया जाता है "use strict"
, तो इसके मूल्य को बदलने की कोशिश कर रहा कुछ भी गलती से समाप्त हो जाएगा, अन्यथा इसे चुपचाप अनदेखा कर दिया जाएगा।
आप प्रॉक्सी का उपयोग भी कर सकते हैं, यह नेस्टेड कॉल के साथ काम करेगा, लेकिन एक अतिरिक्त चेक की आवश्यकता होगी:
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
}
लॉश से .js।
var undefined;
function isUndefined(value) {
return value === undefined;
}
यह एक LOCAL वैरिएबल बनाता है, जिसका नाम undefined
डिफ़ॉल्ट मान के साथ इनिशियलाइज़ किया जाता है - वास्तविक undefined
, फिर value
वैरिएबल से तुलना करता है undefined
।
अपडेट 9/9/2019
मैंने पाया कि लॉश ने इसके कार्यान्वयन को अद्यतन किया। मेरा मुद्दा और कोड देखें ।
बुलेट-प्रूफ होने के लिए, बस उपयोग करें:
function isUndefined(value) {
return value === void 0;
}