2012-12-20 7 views
10

को परिभाषित करने के लिए सेट करना कहें कि मेरे पास कुंजी बार और मान xyz के साथ एक एसोसिएटिव ऐरे फू है।जावास्क्रिप्ट में क्या अधिक कुशल है, किसी तत्व को हटाने या इसे स्पष्ट रूप से

console.log(Foo['bar']); 

>> xyz 

delete Foo['bar']; 
console.log Foo['bar']; 

>> undefined 

Foo['bar'] = 'xyz'; 
console.log(Foo['bar']); 

>> xyz 

Foo['bar'] = undefined; 
console.log (Foo['bar']); 

>> undefined 

मेरा प्रश्न यह है कि, दोनों में से कौन सा अधिक कुशल है, क्या वे किसी भी तरह से भिन्न हैं? क्या कोई परिदृश्य है जब मुझे दूसरे पर एक का उपयोग करना चाहिए?

धन्यवाद!

परिणाम:

की मदद और मुझे jsperf दिखाने के लिए आप सभी को धन्यवाद। इसे अपरिभाषित करने के लिए सेट करना (अपेक्षाकृत) काफी तेज़ हो जाता है, फिर हटाएं, हालांकि नीचे दी गई सभी चेतावनियां भी बहुत रोचक हैं (वास्तव में, मैं शायद बाएं क्षेत्र से भविष्य की त्रुटियों से बचने के लिए बहुत आगे जा रहा हूं)।

+2

http://www.jsperf.com पर जाएं और पता लगाएं। – jAndy

+0

पहले से ही परीक्षण किया गया है? http://jsperf.com/delete-vs-undefined-vs-null/3 – JSuar

+0

'अपरिभाषित' की कुंजी सेट करना आपके ऑब्जेक्ट में कुंजी से छुटकारा नहीं पाता है: http://i.imgur.com/LvPDC .png – Blender

उत्तर

2

यह लंबे समय तक नकारात्मक प्रदर्शन अंतर करेगा क्योंकि b को बाद में undefined पर असाइनमेंट के बाद एक संपत्ति माना जाता है। उदाहरण के लिए:

var a = { b : 0 }; 

a.b = undefined; 

a.hasOwnProperty("b"); 
>>> true 

ही in कीवर्ड के लिए चला जाता है ("b" in a सच है) तो यह सबसे अधिक संभावना यात्रा में बाधा होगा जब एक बड़ा वस्तु का हिस्सा है।

4

मैंने उन परिचालनों के प्रदर्शन को बेंचमार्क नहीं किया है (जैसा कि मैंने एक टिप्पणी में उल्लेख किया है, बस http://www.jsperf.com पर थोड़ा बेंचमार्क बनाएं), लेकिन मैं अंतर पर कुछ शब्द खो दूंगा।

तुम हमेशा पर delete ing गुण, अच्छा wheras उन्हें undefined या null के लिए सेटिंग लोगों और/या कोड लटका है, जो IN ऑपरेटर से दूँगी हो जाएगा।

if('bar' in Foo) { } 

अभी भी वापस आ जाएगी true अगर आप undefined करने के लिए Foo.bar सेट की तरह

। यदि आप delete Foo.bar के साथ जाते हैं तो यह नहीं होगा।

+0

उत्कृष्ट प्रतिक्रिया के लिए धन्यवाद, मैंने इसे ऊपर उठाया। मैंने इसे डेविड को दिया क्योंकि उसका भी उल्लेख किया गया है ओनप्रोपर्टी। मैंने देखा है कि जेएस कोड में –

1

From the link I commented:

हटाने ऑपरेटर एक संपत्ति पूरी तरह से निकाल देता है। एक संपत्ति को पर सेट अप करने से मूल्य हटा दिया जाता है। संपत्ति को शून्य पर सेट करने से शून्य मान को मानता है।

तकनीकी रूप से वे समकक्ष नहीं हैं, लेकिन व्यावहारिक रूप से वे अक्सर एक ही चीज़ का उपयोग करते थे: कि एक संपत्ति अनसेट है।

ऑब्जेक्ट को null पर सेट करना सबसे तेज़ था।

इन आपरेशनों को समझने के लिए कुछ अच्छे संसाधन:

+0

शून्य का दुरुपयोग किया जाता है।यह एक जानबूझकर शून्य मूल्य का प्रतीक है, जैसा कि एक मूल्य के विपरीत सेट नहीं किया गया है। इंगित करने के लिए अच्छा लिंक वे बराबर नहीं हैं। – Aesthete

4

पता है कि एक वस्तु से एक संपत्ति को हटाने में एक ही नाम से एक है, तो एक के साथ कि संपत्ति का स्थान ले लेगा बनें प्रोटोटाइप श्रृंखला पर मौजूद है।

संपत्ति को शून्य या अपरिभाषित करने के लिए बस इसे मुखौटा करना होगा।

1

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

delete Foo['bar'];Foo ऑब्जेक्ट से bar संपत्ति को हटा देता है। अगर कोई Foo के प्रत्यक्ष गुणों पर पुन: प्रयास करता है तो यह वहां नहीं होगा।

Foo['bar'] = undefined संपत्ति को अपरिभाषित करने के लिए सेट करता है, लेकिन यह अभी भी ऑब्जेक्ट पर मौजूद है और अभी भी वहां होगा, लेकिन undefined का मान होगा।

तो, यदि आप संपत्ति से छुटकारा पाने के लिए चाहते हैं, तो delete का उपयोग करें। यदि आप अभी भी संपत्ति चाहते हैं, लेकिन undefined मान रखें, तो इसे undefined पर सेट करें।

यदि आप वास्तव में जानना चाहते हैं कि सबसे तेज़ कौन सा है और किसी कारण से प्रोग्रामिंग अंतर की परवाह नहीं है, तो jsperf.com पर जाएं, स्वयं को दो तुलना परीक्षण केस बनाएं और विभिन्न ब्राउज़रों के समूह में jsperf चलाएं जो आपके लिए प्रासंगिक हैं। सभी वास्तविक प्रश्नों का उत्तर प्रासंगिक वास्तविक विश्व परीक्षण के साथ दिया जाना चाहिए।

+0

उत्कृष्ट प्रतिक्रिया के लिए धन्यवाद, मैंने इसे ऊपर उठाया। मैंने इसे डेविड को दिया क्योंकि उसने कोड उदाहरण के मामले भी दिए थे। –

2

undefined को हटाने या असाइन करने की वास्तविक कार्रवाई को बेंचमार्क करने के अलावा, आपको इसे बदलने के बाद ऑब्जेक्ट का उपयोग करने के भविष्य के प्रदर्शन के प्रभाव पर भी विचार करना चाहिए।

मैं दो के बारे में सोच सकते हैं:

  1. एक बार संपत्ति हटा दी जाती है, उस तक पहुंचने में जावास्क्रिप्ट the prototype chain में उसे ढूंढने की है, जबकि यदि संपत्ति अभी भी वस्तु पर मौजूद है (undefined मूल्य के साथ) का कारण होगा, प्रोटोटाइप श्रृंखला की खोज नहीं की जाएगी।

  2. संपत्ति को हटाने से "वस्तु आकार" बदल जाता है और JavaScript optimizations को नुकसान पहुंचा सकता है।

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