2009-05-22 10 views
20

मैं एक कस्टम जावास्क्रिप्ट वस्तु है कि मैं new साथ बनाने के लिए है, और सृष्टि तर्कों के आधार पर करने के लिए गुण आवंटित:जावास्क्रिप्ट ऑब्जेक्ट पर किसी संपत्ति के अस्तित्व के परीक्षण के लिए सही तरीका क्या है?

function MyObject(argument) { 
    if (argument) { 
     this.prop = "foo"; 
    } 
} 
var objWithProp = new MyObject(true); // objWithProp.prop exists 
var objWithoutProp = new MyObject(false); // objWithoutProp.prop does not exist 

वस्तुओं की prop संपत्ति के अस्तित्व के लिए परीक्षण करने के लिए सही तरीका क्या है? मैंने देखा है निम्न तरीकों का इस्तेमाल किया है, लेकिन मुझे यकीन है कि अगर इन तरीकों में से किसी का सबसे अच्छा तरीका है नहीं कर रहा हूँ:

  • if (obj.prop) {}
  • if (obj.hasOwnProperty("prop")) {}
  • if ("prop" in obj) {}

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

उत्तर

29

hasOwnProperty क्या आप जब से तुम "अगर संपत्ति स्पष्ट रूप से इस वस्तु के लिए परिभाषित किया गया है, प्रोटोटाइप श्रृंखला में नहीं" निर्दिष्ट करते हैं, के लिए देख रहे बिल्कुल है। प्रति https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty, "इस विधि का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि किसी ऑब्जेक्ट में उस ऑब्जेक्ट की प्रत्यक्ष संपत्ति के रूप में निर्दिष्ट संपत्ति है या नहीं; ऑपरेटर के विपरीत, यह विधि ऑब्जेक्ट की प्रोटोटाइप श्रृंखला को जांच नहीं देती है।" - आपकी आवश्यकता से बिल्कुल मेल खाता है!

7

यदि आप किसी ऑब्जेक्ट में परिभाषित संपत्ति की तलाश में हैं, तो आप ऑब्जेक्ट की हैऑनप्रॉपर्टी विधि का उपयोग कर सकते हैं। इस तरह:

myObject = new MyObject(); 
// some code 
if (myObject.hasOwnProperty('prop')) { 
    // prop exists 
} 

लेकिन यह केवल यह जानना है कि ऐसी संपत्ति वस्तु में परिभाषित है, लेकिन इसके माता-पिता नहीं। इसलिए यदि ऐसी संपत्ति वस्तु द्वारा विरासत में मिली है, तो आप इस तरह के अस्तित्व का परीक्षण नहीं कर सकते हैं।

दूसरी तरफ अपरिभाषित मूल्य के खिलाफ संपत्ति का परीक्षण करना है। इस तरह:

if (myObject.prop !== undefined) { 
    // prop exists 
} 

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

if (myObject.prop) { 
} 

गलत परिणाम हो सकता है यदि "प्रोप" में झूठा या शून्य मान है। लेकिन == ऑपरेटर के साथ अपरिभाषित की तुलना करके, आप सुनिश्चित कर सकते हैं कि शून्य/झूठे मान आपको भ्रमित नहीं करेंगे।

if (typeof variable === 'undefined' || variable === null) { 
    // Do stuff 
} 

यह भी properties के लिए इस्तेमाल किया जा सकता है:

2

आप इस प्रकार एक variable के अस्तित्व की जाँच कर सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे