जावास्क्रिप्ट में कितना खतरनाक है, वास्तव में, यह मान लेना अपरिभाषित नहीं है?


86

हर बार जब किसी के खिलाफ परीक्षण का उल्लेख होता है undefined, तो यह इंगित किया जाता है कि undefinedयह एक कीवर्ड नहीं है, इसलिए इसे सेट किया जा सकता है"hello" , इसलिए आपको typeof x == "undefined" इसके बजाय उपयोग करना चाहिए । यह मुझे हास्यास्पद लगता है। कोई भी कभी भी ऐसा नहीं करेगा, और अगर वे ऐसा करते हैं तो यह पर्याप्त होगा कि उन्होंने कभी भी लिखे गए किसी भी कोड का उपयोग न करें ... सही है?

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

C ++ में हर कोई अच्छी तरह से जानता है कि यह कहने के लिए कानूनी है #define true false, लेकिन कोई भी आपको सलाह नहीं देता कि आप इससे बचें trueऔर 0 == 0इसके बजाय उपयोग करें । आप बस यह मान लें कि कोई भी कभी भी ऐसा करने के लिए एक बड़ा झटका नहीं होगा, और यदि वे ऐसा करते हैं, तो अपने कोड पर फिर से भरोसा न करें।

क्या यह वास्तव में किसी ऐसे व्यक्ति को काटता है जहां किसी और को undefined(उद्देश्य पर) सौंपा गया है और इसने आपके कोड को तोड़ दिया है, या यह एक काल्पनिक खतरा है? मैं अपने कोड को थोड़ा और अधिक पठनीय बनाने के लिए अपने मौके लेने को तैयार हूं। क्या यह वास्तव में बुरा विचार है?

पुन: दोहराने के लिए, मैं यह नहीं पूछ रहा हूं कि अनिर्धारित अपरिभाषित से कैसे बचाव किया जाए। मैंने उन तरकीबों को 100 बार पहले ही लिखा हुआ देखा है। मैं पूछ रहा हूं कि उन चालों का उपयोग न करना कितना खतरनाक है।


7
मुझे खुशी होगी, लेकिन मुझे नहीं लगता कि दिए गए तीन उत्तरों में से कोई भी प्रश्न का उत्तर देने का अच्छा काम करता है। मैंने यह स्पष्ट करने की कोशिश की कि मैं जिन उत्तरों से जुड़ा था, उनका पुनर्विचार करने के लिए नहीं कह रहा था, लेकिन अभी भी मुझे वही मिला है। अगर यह माना जाता है कि मुझे यह पूछने पर भी जवाब नहीं देना चाहिए कि मैं क्या पूछ रहा था, तो मुझे बताएं और मैं आगे बढ़कर एक बात मानूंगा!
कॉस्मोलॉनिक

1
मुझे लगता है कि सभी तथ्य यहां दिए गए हैं, हालांकि। इसलिए, आप जो कह रहे हैं, उसके बदले आप एक व्यक्तिपरक उत्तर या राय चाहते हैं, जो केवल असहमति का कारण बनता है। यही कारण है कि वाक्यांश "सर्वोत्तम अभ्यास" को प्रश्न शीर्षक में अनुमति नहीं है। आप एकमात्र व्यक्ति हैं जो यह जान सकते हैं कि यह आपके परिदृश्य में कितना खतरनाक है। और यदि आप एक लोकप्रिय पुस्तकालय लिख रहे हैं जहाँ आप सभी 'चर' को नियंत्रित नहीं करते हैं, तो फ़ंक्शन (अपरिभाषित) {} आवरण एक उत्कृष्ट उत्तर लगता है। इसका उपयोग क्यों न करें और उस उत्तर को स्वीकार करें?
शैनन

4
अगर किसी को किसी के पुनर्परिभाषित की चिंता है undefined, तो आपको किसी के पुनर्परिभाषित के बारे में अधिक चिंता करनी चाहिए XMLHttpRequest, या alert। हमारे द्वारा उपयोग किए जाने वाले सभी कार्यों windowको नए सिरे से परिभाषित किया जा सकता था। और अगर आप दुर्घटना से बस एक सहकर्मी के बारे में चिंतित हैं, तो उन पर भरोसा क्यों न करें window.addEventListener = "coolbeans"? इसका जवाब किसी के बारे में चिंता करने की नहीं है। यदि कोई दुर्भावनापूर्ण रूप से JS को आपके पेज में इंजेक्ट कर रहा है, तो आप वैसे भी hosed हैं। रोकने पर काम है कि पहली जगह में हो रहा से।
क्रिस मिडलटन

जवाबों:


56

नहीं, मेरे पास कभी नहीं है। यह ज्यादातर इसलिए है क्योंकि मैं आधुनिक ब्राउज़रों पर विकसित होता हूं, जो ज्यादातर ईसीएमएस्क्रिप्ट 5 अनुपालन हैं। ES5 मानक तय करता है कि undefinedअब आसानी से पढ़ा जा सकता है। यदि आप सख्त मोड का उपयोग करते हैं (आपको चाहिए), यदि आप गलती से इसे संशोधित करने का प्रयास करते हैं तो एक त्रुटि होगी।

undefined = 5;
alert(undefined); // still undefined
'use strict';
undefined = 5; // throws TypeError

आपको जो नहीं करना चाहिए, वह अपना स्वयं का स्कूप्ड, म्यूटेबल है undefined:

(function (undefined) {
    // don't do this, because now `undefined` can be changed
    undefined = 5;
})();

लगातार ठीक है। फिर भी अनावश्यक, लेकिन ठीक है।

(function () {
    const undefined = void 0;
})();

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

1
@ बेनेडिच: मुझे पता है, मैं कह रहा था कि मैं उस समस्या में कभी नहीं चला, लेकिन यहाँ आपको क्या करना चाहिए
Ry-

1
@bennedich क्या आपके पास गलती से किसी अन्य चर को लिखने की समान संभावना नहीं है?
एटिस गोरल

40

कोई भी उचित कोड ऐसा काम नहीं करेगा। लेकिन आप कभी नहीं जान सकते कि कुछ wannabe- स्मार्ट डेवलपर या एक प्लगइन / लाइब्रेरी / स्क्रिप्ट जो आप उपयोग कर रहे हैं। दूसरी तरफ, यह बहुत ही असंभावित है और आधुनिक ब्राउज़र ओवरराइटिंग की अनुमति नहीं देंगे undefined, इसलिए यदि आप विकास के लिए इस तरह के ब्राउज़र का उपयोग कर रहे हैं, तो आप जल्दी से नोटिस करेंगे यदि कोई कोड इसे अधिलेखित करने का प्रयास करता है।


और भले ही आपने इसके लिए नहीं पूछा था - बहुत से लोग शायद इस सवाल को ढूंढेंगे जब अधिक सामान्य "कैसे पुनर्परिभाषित undefinedमुद्दे से बचाव करना है " की तलाश है, इसलिए मैं जवाब दूंगा कि वैसे भी:

ब्राउज़र कितना भी पुराना क्यों न हो, वास्तव में अपरिभाषित होने का एक बहुत अच्छा तरीका undefinedहै:

(function(undefined) {
    // your code where undefined is undefined
})();

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

(function($, window, undefined) {
    // your code where undefined is undefined
})(jQuery, this);

तब आप सुनिश्चित हो सकते हैं कि उस अनाम कार्य के अंदर निम्नलिखित बातें सत्य हैं:

  • $ === jQuery
  • window === [the global object]
  • undefined === [undefined]

हालांकि, ध्यान दें कि कभी-कभी typeof x === 'undefined'वास्तव में आवश्यक होता है: यदि चर xको कभी भी मूल्य पर सेट नहीं किया गया है (इसके विपरीत सेट किया जा रहा है undefined), तो xएक अलग तरीके से पढ़ना जैसे कि if(x === undefined)एक त्रुटि होगी। यद्यपि यह ऑब्जेक्ट गुणों पर लागू नहीं होता है, इसलिए यदि आप जानते हैं कि yहमेशा एक ऑब्जेक्ट है, if(y.x === undefined)तो पूरी तरह से सुरक्षित है।


2
xमान पर सेट नहीं होने के बारे में आपका कथन काफी हद तक सही नहीं है (देखें jsfiddle.net/MgADz ); यह तब है जब यह वास्तव में परिभाषित नहीं है (देखें jsfiddle.net/MgADz/1 )।
Ry-

7
फिर, अगर कोई गलती से कहता है undefined = someVariableकि यह एक बग है और आप चीजों को तोड़ना चाहते हैं। कम से कम मैं करता हूं।
कॉस्मोलॉनिक

2
मैंने एक कोडबेस के साथ काम किया है, जिसकी एक गोपनीय विरासत स्क्रिप्ट थी जो अपरिभाषित थी, हमारे पास स्क्रिप्ट को फिर से लिखने के लिए समय या बजट नहीं था, यह एक उदाहरण है जहां टाइपो x == "अपरिभाषित" की आवश्यकता थी, यह अजीब नहीं है और शायद नहीं है एक अच्छी आदत।
डेमन थेसिफ़र

2
मुझे दिलचस्पी है कि सभी उदाहरण फ़ंक्शन में अतिरिक्त तर्क के रूप में "अपरिभाषित" का उपयोग क्यों करते हैं? लेकिन ऐसी स्थिति हो सकती है यदि कोई त्रुटि द्वारा एक अतिरिक्त पैराम (परिभाषित) पास करता है और सभी तर्क विफल हो जाएंगे। फ़ंक्शन () {var _undef जैसी किसी चीज़ का उपयोग क्यों न करें; if (someVal == _undef) {कुछ करो}};
ओलेकांदर_डज 15

4
@ ऑलेक्ज़ेंडर_डीजे बिल्कुल। एक मूल्य के आपको लगता है कि बना लो पता है undefinedऔर उस के लिए असाइन undefinedदायरे में। यदि आप "बहुत सारे" तर्कों में पास होते हैं तो ओवरराइटिंग के लिए खुला न छोड़ें undefinedयह त्रुटियों को आमंत्रित करता है, और स्वाभाविक रूप से गैर-रक्षात्मक पैटर्न है, खासकर जब लुसारो बताते हैं , undefinedगुंजाइश में ठोस मूल्यों को प्राप्त करने के लिए बहुत आसान विकल्प हैं ।
रफिन

19

इसका एक सरल समाधान है: void 0जिसकी तुलना हमेशा अनिर्धारित की जाती है।

ध्यान दें कि आपको इससे बचना चाहिए ==क्योंकि यह मानों को बढ़ा सकता है। इसके बजाय उपयोग करें ===और !==)।

कहा कि, अपरिभाषित चर त्रुटि के द्वारा सेट किया जा सकता है अगर कोई =इसके बजाय लिखता है ==जब किसी चीज़ के खिलाफ तुलना की जाती है undefined


IMO, यह सबसे अच्छा जवाब है।
abhisekp 17

1
इस बात पर विचार करें कि foo === void 0जितना संभव हो उतना आसान नहीं पढ़ा जा सकता है foo === undefinedऔर यह अपरिवर्तनीय रूप undefinedसे आधुनिक ब्राउज़रों (IE 9+) द्वारा पूरी तरह से समर्थित है जैसा कि आप इस संगतता तालिका में देख सकते हैं ।
डैनियल एआर वर्नर

3

केवल आप जानते हैं कि आप किस कोड का उपयोग करते हैं, और इसलिए यह कितना खतरनाक है। इस प्रश्न का उत्तर उस तरीके से नहीं दिया जा सकता है जैसा आपने स्पष्ट किया है कि आप इसका उत्तर चाहते हैं।

1) एक टीम नीति बनाएं, अपरिभाषित को पुनर्परिभाषित करते हुए, इसके अधिक लोकप्रिय उपयोग के लिए इसे हटाकर। अपरिभाषित बाएँ असाइनमेंट के लिए अपने मौजूदा कोड को स्कैन करें।

2) यदि आप सभी परिदृश्यों को नियंत्रित नहीं करते हैं, यदि आपका कोड आपके या आपकी नीतियों के नियंत्रण से बाहर की स्थितियों में उपयोग किया जाता है, तो जाहिर है कि आपका उत्तर अलग है। उस कोड को स्कैन करें जो आपकी स्क्रिप्ट का उपयोग करता है। हेक, यदि आप चाहें तो अपरिभाषित बाएं असाइनमेंट के आंकड़ों के लिए वेब को स्कैन करें, लेकिन मुझे संदेह है कि यह आपके लिए किया गया है, क्योंकि इसके बजाय यहां # 1 या # 3 का जवाब देना आसान है।

3) और अगर वह जवाब काफी अच्छा नहीं है, तो शायद यह है क्योंकि, फिर से, आपको एक अलग जवाब की आवश्यकता है। हो सकता है कि आप एक लोकप्रिय पुस्तकालय लिख रहे हों जिसका उपयोग कॉर्पोरेट फ़ायरवॉल के अंदर किया जाएगा, और आपके पास कॉलिंग कोड तक पहुंच नहीं है। फिर यहां एक अन्य ठीक उत्तर का उपयोग करें। नोट करें कि लोकप्रिय jQuery लाइब्रेरी प्रैक्टिस ध्वनि एन्कैप्सुलेशन है, और शुरू होती है:

(function( window, undefined ) {

केवल आप अपने प्रश्न का उत्तर उस विशिष्ट तरीके से दे सकते हैं जो आप चाहते हैं। कहने के लिए और क्या है?

संपादित करें: ps यदि आप वास्तव में मेरी राय चाहते हैं, तो मैं आपको बताता हूं कि यह बिल्कुल भी खतरनाक नहीं है। ऐसी कोई भी चीज जिसके कारण दोष होने की संभावना होगी (जैसे कि अपरिभाषित निर्दिष्ट करना, जो स्पष्ट रूप से एक अच्छी तरह से प्रलेखित जोखिम भरा व्यवहार है) स्वयं एक दोष है। यह जोखिम है कि जोखिम है। लेकिन यह सिर्फ मेरे परिदृश्यों में है, जहां मैं उस परिप्रेक्ष्य को धारण कर सकता हूं। जैसा कि मैं आपको सलाह दूंगा, मैंने अपने उपयोग के मामलों के लिए प्रश्न का उत्तर दिया।


3

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

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


2

undefinedECMAScript 5.1 का समर्थन करने वाले ब्राउज़रों के लिए कोडिंग करते समय आप अपने कोड का उपयोग कर सकते हैं क्योंकि यह भाषा विनिर्देश के अनुसार अपरिवर्तनीय है

यह भी देखें इस अनुकूलता टेबल या इस caniuse ECMAScript 5 देखने के लिए कि सभी आधुनिक ब्राउज़रों (आईई 9+) अपरिवर्तनीय को लागू किया हैundefined


1

यह बिल्कुल भी खतरनाक नहीं है। यह केवल तब ही लिखा जा सकता है जब ES3 इंजन पर चल रहा हो और इसका कोई और उपयोग होने की संभावना न हो।


0

सबसे पहले, यदि आपका कोड टूटता है तो यह संभवत: नहीं है क्योंकि कुछ अन्य डेवलपर वहाँ "झटका लगाने की कोशिश कर रहे हैं" जैसा कि आप इसे डालते हैं।

यह सही है कि undefinedकोई कीवर्ड नहीं है। लेकिन यह है एक वैश्विक स्तर आदिम। इसे इस तरह इस्तेमाल किए जाने का इरादा था ( डेवलपर. mozilla.org पर "अपरिभाषित देखें" ):

var x;
if (x === undefined) {
    // these statements execute
}
else {
    // these statements do not 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=null;
if (x === undefined) {
    // this is probably what you meant to do
    // these lines will not execute in this case
}
else if (x == undefined) {
    // these statements will execute even though x *is* defined (as null)
}
else {
    // these statements do not execute
}

यह एक और अक्सर अनदेखी की गई वजह है कि सभी मामलों में दूसरे विकल्प का उपयोग करना बेहतर है।

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


1
"जिसके कुछ फायदे हैं, स्पष्ट है कि जब एक्स घोषित नहीं होता है तो वह अपवाद को ट्रिगर नहीं करता है।" मुझे सीधे इस बात को समझने दो। आपको लगता है कि एक अघोषित चर का उपयोग करने पर होने वाले अपवाद को चुपचाप अनदेखा करना एक फायदा है? यह बहुत त्रुटि प्रवण लगता है। क्या आप बता सकते हैं कि आपको क्यों लगता है कि यह एक भयानक नुकसान नहीं है?
कॉस्मोलॉनिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.