2009-08-07 13 views
13

यदि मेरे पास जावास्क्रिप्ट सूची है जिसमें केवल संख्यात्मक कुंजी होंगी, जो कम स्मृति लेती है?जो कम स्मृति लेता है: एक जावास्क्रिप्ट सरणी या जावास्क्रिप्ट ऑब्जेक्ट?

var array = []; 
array[0] = 'hello'; 
array[5] = 'world'; 
array[50] = 'foobar'; 

var obj = {}; 
obj[0] = 'hello'; 
obj[5] = 'world'; 
obj[50] = 'foobar'; 

मैं जावास्क्रिप्ट इंजन internals के बारे में एक टन पता नहीं है, तो ...

कारण मैं पूछ है, क्योंकि है कि सरणी, जब एक स्ट्रिंग में परिवर्तित, में अपरिभाषित के का एक समूह होगा इसके बीच क्या वे वास्तव में कुछ फैशन में संग्रहीत हैं, या यह सिर्फ स्ट्रिंग रूपांतरण में डाल दिया गया है?

+0

अपने अंतिम प्रश्न का उत्तर देने के लिए ("क्या वे वास्तव में कुछ फैशन में संग्रहीत हैं?"), नहीं, वे संग्रहीत नहीं हैं, और हां, यह केवल स्ट्रिंग रूपांतरण का हिस्सा है। (यद्यपि आपको अभी भी इस तरह की चीज के लिए सरणी के बजाय वस्तुओं का उपयोग करना चाहिए।) –

उत्तर

11

एक सरणी मूल रूप से एकल चर नाम से जुड़े मूल्यों का क्रमबद्ध सेट है।

आपके उदाहरण में मुझे लगता है कि आप एक एसोसिएटिव सरणी करने का प्रयास करते हैं, और आपको ऑब्जेक्ट का उपयोग करना चाहिए, ऐरे का उपयोग कुंजी/मूल्य जोड़े के लिए नहीं किया जाना चाहिए।

इसके अलावा सरणी लंबाई indirecly बढ़ जाती है जब आप वर्तमान सरणी लंबाई के उच्च लंबाई के साथ एक सूचकांक करने के लिए एक मूल्य निर्दिष्ट:

var array = new Array(); 
array[99] = "Test"; 
// array.length is now 100 

चेक विषय पर इस detailed article

+0

ध्यान दें कि यह वास्तव में सरणी को उठाने वाली स्मृति की मात्रा में वृद्धि नहीं करता है (या कम से कम नहीं होना चाहिए - कुछ ब्राउज़र इस तरह की स्थिति को अच्छी तरह से संभाल नहीं सकते हैं)। 'लम्बाई' प्रॉपर्टी केवल अंतिम संख्यात्मक इंडेक्स परिभाषित + 1 लौटाती है, इसलिए आप उस व्यवहार को देखते हैं। लेकिन मैं मानता हूं कि किसी ऑब्जेक्ट का इस्तेमाल सभी कारणों से किया जाना चाहिए। –

-1

शायद जावास्क्रिप्ट सरणी क्योंकि आप 'केवल' संख्यात्मक कुंजी मानों का उपयोग कर सकते हैं, जहां ऑब्जेक्ट शब्दशः महत्वपूर्ण मानों के लिए एक स्थान प्रदान करते हैं, और यदि आप संख्यात्मक कुंजी मानों का उपयोग करते हैं, तो भी उन्हें संख्यात्मक कुंजी मानों से अलग तरीके से संभाला जाता है सरणी के लिए।

अधिकतर कारण सरणी में टेक्स्ट-आधारित कुंजी मान नहीं हो सकते हैं क्योंकि ऑब्जेक्ट अक्षर से अलग तरीके से उनका इलाज किया जाता है। मैं अनुमान लगा रहा हूं क्योंकि उन्हें शायद अलग तरीके से इलाज किया जाता है, इसलिए सरणी के लिए प्रसंस्करण शायद संख्यात्मक कुंजी मानों के लिए अधिक अनुकूलित है, क्योंकि ऑब्जेक्ट शाब्दिक को तारों या संख्याओं को उनकी चाबियों के रूप में उपयोग करने के लिए अनुकूलित किया गया है।

+2

Arrays "टेक्स्ट-आधारित कुंजी मान" हो सकते हैं ... Arrays केवल ऑब्जेक्ट्स (कम से कम जेएस में) हैं। – James

0

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

+3

यह गलत है - सभी जेएस कार्यान्वयन में सरणी के "कुशल" कार्यान्वयन होते हैं, कम से कम वे सामान्य वस्तुओं की तुलना में काफी अधिक कुशल होते हैं। वे सभी मानते हैं कि एक कॉम्पैक्ट सरणी मानक है, और एक स्पैस सरणी असामान्य है, और कारण के लिए "सामान्य" सरणी उपयोग के लिए अनुकूलित करें। बहुत सरल पेर्फ परीक्षण से पता चला होगा कि: डी – olliej

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