2011-07-21 17 views
5

के अंदर काम नहीं करता है मैं जावास्क्रिप्ट के साथ काम कर रहा एक सी/सी ++/जावा प्रोग्रामर हूं।जावास्क्रिप्ट 'डिलीट' पुनरावृत्ति लूप

मैं एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो ऑब्जेक्ट 'obj' के सभी गुणों को हटा देगा। मैंने "How to quickly clear a Javascript Object?" पर पोस्टिंग पढ़ी है और देखा है कि दो जवाब हैं: (1) एक नया 'ओबीजे' बनाना (जो मैं नहीं करना चाहता क्योंकि मेरा कोड एक मोबाइल ब्राउज़र में चल रहा एक उच्च प्रदर्शन प्रोग्राम है , और मैं कचरा संग्रह को कम करना चाहता हूं); और (2) एक लूप में किसी ऑब्जेक्ट के गुणों पर पुनरावृत्ति और गुणों को हटाने। यह बाद दृष्टिकोण क्रोम 12. में काम नहीं करता

पर विचार करें निम्नलिखित कोड:

var foo = {}; 
foo['baz'] = 'bar'; 
console.log("1. foo.baz = " + foo.baz); 

delete foo.baz; 
console.log("2. foo.baz = " + foo.baz); 

foo['baz'] = 'bar'; 
console.log("3. foo.baz = " + foo.baz); 

for (prop in foo) 
{ 
    if (foo.hasOwnProperty(prop)) 
    { 
     console.log("deleting property " + prop); 
     delete foo.prop; 
    } 
} 
console.log("4. foo.baz = " + foo.baz); 

यह क्रोम 12 पर मेरे कंसोल में निम्न परिणाम पैदा करता है:

1. foo.baz = bar 
2. foo.baz = undefined 
3. foo.baz = bar 
deleting property baz 
4. foo.baz = bar 

क्यों नहीं करता है foo.baz लूप के अंदर हटा दिया जाता है?

उत्तर

8

: आप इस तरह इसे हटाने के लिए की जरूरत है:

delete foo[prop]; 
+0

(1) मैं इस धारणा के तहत था कि संपत्ति नोटेशन foo.prop और foo [prop] समकक्ष थे, उदाहरण के लिए http://www.jibbering.com/faq/faq_notes/square_brackets.html में उल्लिखित है। (2) मेरे उदाहरण में "foo.baz हटाएं" क्यों काम करता है? (3) जैसा कि मैंने उल्लेख किया है, मैं कचरा संग्रह को कम करना चाहता हूं क्योंकि मैं मोबाइल ब्राउज़र पर काम कर रहा हूं। – stackoverflowuser2010

+0

'foo.prop' 'foo [" prop "]' के बराबर है। फर्क देखें? यदि आप गतिशील रूप से 'foo' से संपत्ति खींचना चाहते हैं, तो आपको' foo [prop] 'का उपयोग करने की आवश्यकता है। – digitalbath

+0

@ stackoverflowuser2010: मैं जीसी में कुछ और विश्वास रखूंगा। यदि आप प्रत्येक क्लिक पर ऑब्जेक्ट्स का टन नहीं बनाते हैं, तो आपको ठीक होना चाहिए। स्पष्ट रूप से सभी गुणों को हटाकर और फिर नए जोड़ना एक नया निर्माण करने और पुराने को जीसी में छोड़ने से काफी लंबा समय ले सकता है! – delnan

3

यह लाइन delete foo.prop गलत है। foo इस मामले में prop नाम की कोई संपत्ति नहीं है। ब्रैकेट्स का उपयोग delete foo[prop]

+0

हम्म। मुझे आश्चर्य है कि यह क्यों गिराया गया था। मुझे विशेष रूप से इसमें कुछ भी गलत नहीं दिख रहा है। – Reid

+0

मैंने खुद को आश्चर्यचकित कर दिया। मुझे लगता है कि कोई मेरे त्वरित जवाब से ईर्ष्यावान था। ;) – Joe

0

क्योंकि foo.prop को हटाने के लिए कभी परिभाषित नहीं किया गया था। आप गलत तरीके से key देखने

delete foo[prop]; 

HTH

0

बजाय इस कोशिश करो।

delete foo[ prop ]; 

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

foo = null; // done 

उच्च प्रदर्शन की बात करते हुए, वही तरीका है जो आप करना चाहते हैं।

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