किसी भी विशेष इंजन के मामले में इसका वास्तविक जवाब उस इंजन के कार्यान्वयन पर निर्भर करेगा। (जैसा कि अंतर का आकार होगा, यदि कोई हो।)
हालांकि, इनवेरिएंट हैं। उदाहरण के लिए, पर विचार करें:
var obj = {a: "alpha", b: "beta"};
var name;
for (name in obj) {
console.log(obj[name]);
}
var arr = ["alpha", "beta"];
var index;
for (index = 0; index < arr.length; ++index) {
console.log(arr[index]);
}
obj
के मामले में, इंजन एक तंत्र का उपयोग करने के आप पहले से ही अधिक दोहराया और जो किया है जो गुणों का ट्रैक रखने के लिए नहीं है, साथ ही को छान है लोगों को है गैर-गणना योग्य गुण। उदा।, दृश्यों के पीछे कुछ प्रकार की इटरेटर ऑब्जेक्ट है (और जिस तरह से spec परिभाषित किया गया है, यह एक अस्थायी सरणी भी हो सकता है)।
arr
के मामले में, यह नहीं है; आप इसे अपने कोड में, एक बहुत ही सरल, कुशल तरीके से प्रबंधित कर रहे हैं।
प्रत्येक पाश के ब्लॉक की सामग्री समान है: किसी ऑब्जेक्ट पर एक प्रॉपर्टी लुकअप। (बाद के मामले में, सिद्धांत रूप में, एक संख्या-से-स्ट्रिंग रूपांतरण भी है।)
तो मुझे उम्मीद है कि इसका एकमात्र गैर-कार्यान्वयन-विशिष्ट उत्तर यह है: अतिरिक्त ओवरहेड।
स्रोत
2012-11-21 08:07:36
हाँ, मुझे लगता है कि सभी चाबियां प्राप्त करने की तुलना में एक सापेक्ष धीमी प्रक्रिया है ... उन्हें प्राप्त नहीं करना;) 'इन ... इन्हें पहले कुंजी को देखना है जबकि सामान्य' लूप, आप लूप वैरिएबल के माध्यम से कुंजी प्रदान कर रहे हैं। –
यहां एक जेएसपीआरएफ परीक्षण है जो दिखाता है कि 'इन ... इन' का रन लगभग 'ऑब्जेक्ट.कीज() '(कम से कम क्रोम में) जैसा ही है: http://jsperf.com/for-in- बनाम-कुंजी-बनाम-के लिए।तो, चाबियाँ प्राप्त करना और/या इससे संबंधित सब कुछ धीमा है और बाहर से चाबियाँ प्रदान करना है। लेकिन यह कार्यान्वयन पर भी निर्भर करता है, जैसे टी.जे. कहते हैं। –