2012-10-30 32 views
28

मैं चर घोषित कर दिया और अपरिभाषित और अशक्त करने के लिए सेट के साथ अलग अलग कोड उदाहरण देखा है। जैसे:जब मैं अशक्त साथ जावास्क्रिप्ट में चर को प्रारंभ करते हैं या बिल्कुल नहीं?

var a; // undefined - unintentional value, object of type 'undefined' 
var b = null; // null - deliberate non-value, object of type 'object' 

कोड इन घोषणाओं का पालन करने के लिए एक मूल्य प्रदान करती है तो ए या बी को, दूसरे पर घोषणा का एक प्रकार का उपयोग कर के लिए क्या कारण है?

उत्तर

22

पहला उदाहरण वैरिएबल को कुछ भी निर्दिष्ट नहीं करता है, इसलिए यह स्पष्ट रूप से undefined मान को संदर्भित करता है (विवरण के लिए 10.5 in the spec देखें)। इसका उपयोग आमतौर पर बाद में उपयोग के लिए चर घोषित करते समय किया जाता है। आवश्यक से पहले उन्हें स्पष्ट रूप से कुछ भी निर्दिष्ट करने की आवश्यकता नहीं है।

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

Object.prototype.toString.call(null); // Returns "[object Null]" 
+0

बस एक नोट ... मैं '" [वस्तु अशक्त] "' 'toString का परिणाम() लगता है हो सकता है कुछ ब्राउज़र असंगतताओं। –

6

मैं सिर्फ इस लिंक जो मेरे सवाल का स्पष्ट देखा:

एक के रूप में एक तरफ, null की कि मोड़ प्रकार की जाँच की एक और अधिक मजबूत फार्म का उपयोग करने के लिए एक अच्छा कारण है। What reason is there to use null instead of undefined in JavaScript?

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

+3

+1 यह – techfoobar

0

अशक्त एक वस्तु जाहिर है .. जब कुछ अपरिभाषित है यह कुछ भी नहीं है .. यह है क्योंकि यह परिभाषित अभी तक नहीं किया गया है, एक वस्तु, न तो एक स्ट्रिंग नहीं है .. .. तो यह बस नहीं के साथ एक संपत्ति है समारोह ..

उदाहरण:

आप वर के साथ एक चर घोषित लेकिन यह सेट नहीं।

var foo; 
alert(foo); //undefined. 

आप किसी ऑब्जेक्ट पर किसी संपत्ति तक पहुंचने का प्रयास नहीं करते हैं जिसे आपने कभी सेट नहीं किया है।

var foo = {}; 
alert(foo.bar); //undefined 

आप कभी भी प्रदान किए गए तर्क तक पहुंचने का प्रयास नहीं करते हैं।

function myFunction (foo) { 
    alert(foo); //undefined. 
} 
10

मुझे नहीं लगता कि चीजों को करने का एक बेहतर बेहतर तरीका है, लेकिन मैं जितना संभव हो उतना अपरिभाषित से बचने के इच्छुक हूं। शायद यह एक मजबूत ओओपी पृष्ठभूमि के कारण है।

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

मैं विशिष्ट व्यवहार के लिए undefined रखने पसंद करते हैं:

  • जब आप एक विधि कॉल, किसी भी तर्क आप प्रदान नहीं करते हैं एक अपरिभाषित मूल्य होगा। वैकल्पिक तर्क होने का अच्छा तरीका, तर्क को परिभाषित नहीं किया गया है, तो एक विशिष्ट व्यवहार को लागू करना।
  • आलसी init ... मेरी किताब अपरिभाषित में अर्थ है "आरंभ नहीं: मूल्य लाने जाना", और अशक्त "प्रारंभ लेकिन मान शून्य था (जैसे कि शायद एक सर्वर त्रुटि हुई थी?)" का मतलब है
  • सरणियों: myArray [myKey] === शून्य अगर इस कुंजी के लिए शून्य मान है, तो इस कुंजी के लिए कोई मान सेट नहीं किया गया है, तो अपरिभाषित।

हालांकि सावधान रहें, कि myVar == null और myVar == undefined समान मान चाहे myVar, अपरिभाषित अशक्त या कुछ और है। यदि आप जानना चाहते हैं कि कोई चर अपरिभाषित है या नहीं, तो === का उपयोग करें।

+0

का पालन करने के लिए एक अच्छी प्रैक्टिस की तरह लगता है, अंतिम पंक्ति में, यह ध्यान दिया जाना चाहिए कि 'शून्य' के बाहर '=== '(ट्रिपल बराबर)' शून्य 'कुछ भी नहीं है (क्योंकि यह" ऑब्जेक्ट "है)। –

1

मैं स्पष्ट रूप से अशक्त का चयन करेंगे, एक वस्तु जिसका आईडी बाद में वैसे भी अधिलेखित कर दिया गया है | नहीं करने के लिए:

var foo = {}; // empty object, has id etc. 
var foo2 = null; // good practice, // filled with an object reference at a later time 
var foo3;// undefined, I would avoid it 
console.log(typeof foo); 
console.log(typeof foo2); 
console.log(typeof foo3); 

null डेटा टाइप (वस्तु), परिणाम

में पहचान करने के लिए अच्छा पठनीयता सुनिश्चित करता है
object 
object 
undefined 

स्रोत (वेब ​​डेवलपर्स 3 संस्करण के लिए व्यावसायिक जावास्क्रिप्ट):

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

if (foo2 != null){ 
    //do something with foo2 
} 

मूल्य अपरिभाषित अशक्त की एक व्युत्पन्न है, इसलिए ECMA-262 उन्हें परिभाषित करता है के रूप में इस अल्पज्ञता बराबर हो:

console.log(null == undefined); // prints true 
console.log(null === undefined);// prints false 
+0

शायद आप उत्तर संपादित कर सकते हैं और कुछ संदर्भ लिंक और तर्क जोड़ सकते हैं। यहां बस "अच्छा अभ्यास" छोड़ना एक राय से ज्यादा कुछ नहीं है। –

+1

मैंने संदर्भ पुस्तक को जोड़ा, "बस एक पुस्तक" मानक नहीं – ItsmeJulian