2012-01-03 11 views
6

मैं यह जांचना चाहता हूं कि कोई ऑब्जेक्ट खाली है या नहीं: {}। निम्नलिखित आम तौर पर प्रयोग किया जाता है:ऑब्जेक्ट.प्रोटोटाइप संशोधित किए जाने पर ऑब्जेक्ट "isEmpty()" ऑब्जेक्ट का परीक्षण कैसे करें?

function isEmpty(obj) { 
    for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) 
     return false; 
    } 
    return true; 
} 

लेकिन लगता है Object प्रोटोटाइप के रूप में इस के लिए जोड़ा गया:

Object.prototype.Foo = "bar"; 

टेस्ट:

alert(isEmpty({}));    // true 
Object.prototype.Foo = "bar"; 
alert({}.Foo);     // "bar" oh no... 
alert(isEmpty({}));    // true ...**huh?!** 

मैं वस्तु के प्रोटोटाइप परमाणु करने की कोशिश की, बदल यह है कन्स्ट्रक्टर, और इस तरह के हैक के सभी तरीके। कुछ भी काम नहीं किया, लेकिन शायद मैंने यह गलत (संभावित) किया था।

+0

असल में मुझे एहसास हुआ कि यह प्रश्न शायद गलत तरीके से phrased है, यह शायद होना चाहिए: _ "कैसे जांचें कि एक प्रोटोटाइप श्रृंखला बदल दी गई है" _? –

+0

... और एकमात्र तरीका मैं सोच सकता हूं कि "ऑब्जेक्ट", "संख्या", "ऐरे" आदि के लिए प्रत्येक संपत्ति को हार्डकोड करना है, और जांचें कि ज्ञात गुणों के बाहर कुछ भी नहीं है। काफी गन्दा हालांकि मैं यह देखने के लिए एक यूनिट टेस्ट में ऐसा करना चाहता हूं कि कोई भी आदिम प्रकारों में कुछ नहीं फंसता, जिसे मैं हमेशा संदेह करता हूं (क्योंकि यह मेरे कोड को डाउनस्ट्रीम को उड़ा सकता है और मैं समस्या का पता लगाने के लिए संघर्ष करता हूं) । –

+0

इसे पढ़ें: http://www.3site.eu/doc/ – diEcho

उत्तर

3

बस obj.hasOwnProperty फिल्टर निकालें:

function isEmpty(obj) { 
    for (var prop in obj) { 
    return false; 
    } 
    return true; 
} 

DEMO

इस तरह यह भी आपको पता चलेगा कि किसी भी गुण होता है या अगर कुछ भी, प्रोटोटाइप श्रृंखला में है अगर है कि तुम क्या चाहते हो।

वैकल्पिक रूप से आप को बदल सकते हैं

if (obj.hasOwnProperty(prop)) 

अगर आप केवल अगर कुछ यह प्रोटोटाइप के साथ खिलवाड़ कर रहा है जानना चाहता हूँ

को
if (!obj.hasOwnProperty(prop)) 

+0

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

+0

@ पीटरमार्क्स: आम तौर पर 'हैऑनप्रोपर्टी' का उपयोग विरासत में प्राप्त संपत्तियों को अनदेखा करने के लिए किया जाता है, लेकिन चूंकि आप विरासत में समर्थकों में रुचि रखते हैं तो फ़िल्टर प्रतिकूल है। – qwertymk

+0

एफडब्ल्यूआईडब्लू, जेएसलिंट शिकायत करता है कि 'हैऑनप्रॉपर्टी 'चेक को हटाते समय। हालांकि सुनिश्चित करें कि क्यों। इसके लिए कुछ और है जो मुझे नहीं मिल रहा है। –

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