परफैक्ट भी एक कारण है। कभी-कभी आपको चाबियों पर लूप करने की आवश्यकता हो सकती है। इसे करने बहुत सारे तरीके हैं
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
मैं आमतौर पर इसका उपयोग for of Object.keys()
करता हूं क्योंकि यह सही काम करता है और यह अपेक्षाकृत अच्छा है, चेक को जोड़ने की कोई आवश्यकता नहीं है।
लेकिन, यह बहुत धीमा है ।
बस अनुमान लगाना Object.keys
धीमा है कि यह स्पष्ट है, Object.keys()
आवंटन करना है। वास्तव में AFAIK के बाद से सभी चाबियों की एक प्रति आवंटित करना है।
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
यह संभव है कि जेएस इंजन किसी प्रकार की अपरिवर्तनीय कुंजी संरचना का उपयोग कर सकता है ताकि Object.keys(object)
एक संदर्भ कुछ लौटाए जो अपरिवर्तनीय कुंजियों पर निर्भर object.newProp
करता है और जो पूरी तरह से नई अपरिवर्तनीय कुंजी ऑब्जेक्ट बनाता है लेकिन जो भी हो, यह स्पष्ट रूप से 15x तक धीमा है
यहां तक कि जांच hasOwnProperty
2x धीमी तक है।
उस सभी का मुद्दा यह है कि यदि आपके पास पूर्ण संवेदनशील कोड है और कुंजी पर लूप करने की आवश्यकता है, तो आप for in
कॉल किए बिना उपयोग करने में सक्षम होना चाहते हैं hasOwnProperty
। यदि आप संशोधित नहीं हुए हैं तो आप केवल यही कर सकते हैंObject.prototype
ध्यान दें कि यदि आप Object.defineProperty
प्रोटोटाइप को संशोधित करने के लिए उपयोग करते हैं यदि आप जो चीजें जोड़ते हैं, वे उल्लेखनीय नहीं हैं, तो वे उपरोक्त मामलों में जावास्क्रिप्ट के व्यवहार को प्रभावित नहीं करेंगे। दुर्भाग्य से, कम से कम क्रोम 83 में, वे प्रदर्शन को प्रभावित करते हैं।
मैंने 3000 गैर-विलुप्त होने वाले गुणों को जोड़ा, ताकि किसी भी पूर्ण मुद्दों को प्रकट करने के लिए मजबूर किया जा सके। केवल 30 गुणों के साथ परीक्षण यह बताने के लिए बहुत करीब थे कि क्या कोई पूर्ण प्रभाव था।
https://jsperf.com/does-adding-non-enumerable-properties-affect-perf
फ़ायरफ़ॉक्स 77 और सफारी 13.1 में संवर्धित और अनारक्षित वर्ग के बीच पूर्ण रूप से कोई अंतर नहीं दिखाया गया है, शायद v8 इस क्षेत्र में तय हो जाएगा और आप पूर्ण मुद्दों की अनदेखी कर सकते हैं।
लेकिन, मुझे यह भी जोड़ने की कहानी हैArray.prototype.smoosh
। लघु संस्करण मूटोल्स, एक लोकप्रिय पुस्तकालय है, जिसने अपना स्वयं का बनाया है Array.prototype.flatten
। जब मानकों की समिति ने एक देशी को जोड़ने की कोशिश की तो Array.prototype.flatten
उन्होंने पाया कि बहुत सारी साइटें तोड़े बिना नहीं रह सकतीं। ब्रेक के बारे में पता लगाने वाले देवों ने es5 पद्धति smoosh
को एक मजाक के रूप में नामित करने का सुझाव दिया लेकिन लोगों ने इसे मजाक नहीं समझते हुए इसे गलत बताया। वे के flat
बजाय पर बसेflatten
कहानी का नैतिक यह है कि आपको देशी वस्तुओं का विस्तार नहीं करना चाहिए। यदि आप करते हैं तो आप अपने सामान को तोड़ने के एक ही मुद्दे में चला सकते हैं और जब तक कि आपका विशेष पुस्तकालय MooTools के रूप में लोकप्रिय नहीं होता है, ब्राउज़र विक्रेताओं को आपके द्वारा उत्पन्न समस्या के आसपास काम करने की संभावना नहीं है। यदि आपकी लाइब्रेरी उस लोकप्रिय को प्राप्त करती है, तो आपके द्वारा जारी किए गए मुद्दे के आसपास हर किसी को काम करने के लिए मजबूर करने का यह मतलब होगा। तो, कृपया देशी वस्तुओं का विस्तार न करें