क्या उन पर पुनरावृत्ति करते हुए किसी ऑब्जेक्ट प्रॉपर्टी को हटाना सुरक्षित है?


101

जब किसी वस्तु के गुणों के बारे में अधिक जानकारी प्राप्त होती है, तो क्या फॉर-इन लूप में उन्हें हटाना सुरक्षित होता है?

उदाहरण के लिए:

for (var key in obj) {
    if (!obj.hasOwnProperty(key)) continue;

    if (shouldDelete(obj[key])) {
        delete obj[key];
    }
}

कई अन्य भाषाओं में किसी सरणी या शब्दकोश पर चलना और उसके अंदर हटाना असुरक्षित है। क्या यह जेएस में ठीक है?

(मैं मोज़िला स्पिडरमोनकी रनटाइम का उपयोग कर रहा हूं।)


मैंने इस प्रश्न पर एक इनाम शुरू किया है क्योंकि मुझे लगता है कि वर्तमान उत्तर अपर्याप्त है और प्रस्तुत प्रश्न का उत्तर नहीं देता है । कृपया एक प्रासंगिक स्रोत (विनिर्देश से उम्मीद है) और लागू होने पर कोई भी उल्लेखनीय ब्राउज़र "quirks" भी शामिल करें।
user2864740

जवाबों:


117

ECMAScript 5.1 मानक खंड 12.6.4 (पर के लिए-इन छोरों) का कहना है:

गणना की जा रही वस्तु के गुणों को गणना के दौरान हटाया जा सकता है। यदि एक संपत्ति जो अभी तक एन्यूमरेशन के दौरान नहीं देखी गई है, उसे हटा दिया जाता है, तो उसे विज़िट नहीं किया जाएगा। यदि एन्यूमरेशन के दौरान एनुमरेट की जा रही वस्तु में नए गुण जोड़े जाते हैं, तो नए जोड़े गए गुणों को सक्रिय एन्यूमरेशन में जाने की गारंटी नहीं है। संपत्ति का नाम किसी भी गणना में एक से अधिक बार नहीं जाना चाहिए।

इसलिए मुझे लगता है कि यह स्पष्ट है कि ओपी का कोड कानूनी है और उम्मीद के मुताबिक काम करेगा। ब्राउज़र quirks पुनरावृति क्रम को प्रभावित करते हैं और सामान्य रूप से कथन हटाते हैं, लेकिन यह नहीं कि OPs कोड काम करेगा या नहीं। यह आम तौर पर केवल पुनरावृत्ति में वर्तमान संपत्ति को हटाने के लिए सबसे अच्छा है - ऑब्जेक्ट में अन्य संपत्तियों को हटाने से अप्रत्याशित रूप से उन्हें शामिल किया जाएगा (यदि पहले से ही दौरा किया गया है) या पुनरावृत्ति में शामिल नहीं है, हालांकि इसके आधार पर चिंता का विषय हो सकता है या नहीं परिस्थिति।

यह सभी देखें:

हालांकि इनमें से कोई भी वास्तव में ओपी के कोड को प्रभावित नहीं करता है।


1
मैंने अभी देखा कि मैंने अन्य उत्तर, माफी के समान मानकों को शामिल किया है।
टॉम ऑक्ट

17

से जावास्क्रिप्ट / ECMAScript विनिर्देश (विशेष रूप से के लिए-इन वक्तव्य 12.6.4 ):

गणना की जा रही वस्तु के गुणों को गणना के दौरान हटाया जा सकता है । यदि एक संपत्ति जो अभी तक एन्यूमरेशन के दौरान नहीं देखी गई है, उसे हटा दिया जाता है, तो उसका दौरा नहीं किया जाएगा। यदि गणना के दौरान गणना की जा रही वस्तु में नए गुण जोड़े जाते हैं, तो नए जोड़े गए गुणों को सक्रिय गणना में जाने की गारंटी नहीं है । संपत्ति का नाम किसी भी गणना में एक से अधिक बार नहीं जाना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.