2011-08-08 27 views
7

इस के अनुसार: http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9f.html उद्धरण:किसी ऑब्जेक्ट पर अवांछित चर का लाभ क्या है? शून्य और अपरिभाषित के बीच क्या अंतर है?

एक untyped चर प्रकार वस्तु के एक चर के रूप में ही नहीं है। मुख्य अंतर यह है कि अवांछित चर विशेष मान को अपरिभाषित कर सकते हैं, जबकि ऑब्जेक्ट का एक चर उस मान को नहीं रख सकता है।

लेकिन जब मैं के रूप में यह परीक्षण:

 

      var objTest:Object = 123;   
      var untypedTest:* = 123; 

      objTest = undefined; 
      untypedTest = undefined;    
      //This is understandable but why was the assignment even allowed? 
      trace(objTest); // prints null 
      trace(untypedTest); // prints undefined 

      objTest=null; 
      untypedTest = null;   
      //This is also understandable ... both can store null 
      trace(objTest); // prints null 
      trace(untypedTest); // prints null 

      //If they are null whey are they being equal to undefined? 
      if(objTest==undefined) 
       trace("obj is undefined"); 
      if(untypedTest==undefined) 
       trace("untyped is undefined"); 
      //Because null is same as undefined! 
      if(null==undefined) 
       trace("null is same as undefined?"); 

 

दो सवाल:

  • क्यों काम obj के लिए अनुमति दी अपरिभाषित करने के लिए किया जाता है? (यह अभी भी एक बड़ी समस्या नहीं है क्योंकि यह अभी भी शून्य के रूप में प्रिंट करता है)
  • यदि हम निष्पक्ष परिणाम को सही के साथ शून्य की तुलना करते हैं (भले ही किसी ऑब्जेक्ट में नल संग्रहीत हो)। शून्य और अपरिभाषित के बीच अंतर बनाने का क्या मतलब है यदि वे बराबर हैं?

उत्तर

10
  • फ्लैश में कुछ प्रकारों को बदलने के लिए प्रकार का रूपांतरण है।

से सम्बन्धित कुछ नमूने:

var i:int = NaN; 
trace (i); // 0 

या:

var b:Boolean = null; 
trace(b); // false 

तो जब आप बताए रहे undefinedObject उदाहरण के लिए फ़्लैश null उसी तरह में बदल देता है।

  • आपकी तुलना Boolean का मूल्यांकन करने से पहले असंगत प्रकारों पर लागू प्रकार का रूपांतरण लागू करती है।

आप false के लिए सख्त तुलना का उपयोग कर सकते हैं:

if(null === undefined) 
    trace("Never traced: null is not the same as undefined!"); 
+1

बहुत बढ़िया ... सही स्पष्टीकरण – basarat

+1

आप यह देखने के लिए अपरिभाषित भी करते हैं कि कोई वस्तु किसी ऑब्जेक्ट में है या नहीं। यानी 'अगर (myObj [" someKey "] == अपरिभाषित) // इसे जोड़ें '। आप * चेक के लिए भी नल का उपयोग कर सकते हैं, लेकिन जब कोई मूल्य के रूप में शून्य को स्टोर करना चाहता था तो यह टूट जाएगा, उदा। 'myObj [" someKey "] = शून्य; // मान्य' – divillysausages

+0

@ डिविललीसॉजेज, 'अपरिभाषित' का उपयोग करके बहिष्कृत किया गया है। भ्रम को रोकने के लिए यह केवल शून्य होना चाहिए। यदि आपको 'नो वैल्यू' के साथ कोई कुंजी स्टोर करने की आवश्यकता है तो बस '0' या' false' का उपयोग करें (किसी भी कीमत के बिना किसी कुंजी का बिंदु क्या होगा?)। –

0

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

इस तरह का एक रूपांतरण undefinednull में परिवर्तित किया जा रहा है जब Object पर प्रचारित किया गया। इसलिए null == undefined क्योंकि मूल रूप से क्या किया गया है वास्तव में Object(null) == Object(undefined) है और यह null == null है।

हालांकि, यदि आप सख्त तुलना करते हैं, तो वे परिवर्तित नहीं होते हैं और इस प्रकार बराबर नहीं होते हैं, यानी null === undefined झूठी पैदा करेगा।