2012-02-10 12 views
18

जावास्क्रिप्ट Array, और Object के बीच का अंतर बहुत बड़ा नहीं है। वास्तव में ऐसा लगता है Array मुख्य रूप से length फ़ील्ड जुड़ जाता है, तो आप सांख्यिक सरणियों के रूप में दोनों Array और Object s का उपयोग कर सकते हैं:क्या जावास्क्रिप्ट Arrays वास्तव में सरणी के रूप में लागू किया गया है?

var ar = new Array(); 
ar[0] = "foo"; 
ar["bar"] = "foo"; 

var ob = new Object(); 
ob[0] = "foo"; 
ob["bar"] = "foo"; 

assert(ar[0] == ob[0] == ar["0"] == ob["0"] == ar.bar == ob.bar); // Should be true. 

तो मेरे सवालों का है, लोकप्रिय जावास्क्रिप्ट इंजन में (वी 8, JavaScriptCore, Spidermonkey, आदि), यह कैसे संभाला जाता है? जाहिर है, हम नहीं चाहते हैं कि हमारे सरणी वास्तव में महत्वपूर्ण मूल्यों के साथ हैश मानचित्र के रूप में संग्रहीत हों! हम कैसे सुनिश्चित कर सकते हैं कि हमारा डेटा वास्तविक सरणी के रूप में संग्रहीत किया जा सके?

जहां तक ​​मैं देख सकता हूँ वहाँ कुछ दृष्टिकोण हैं इंजन ले सकता है:

  1. ArrayObject के रूप में ठीक उसी तरह कार्यान्वित किया जाता है - स्ट्रिंग कुंजी के साथ एक साहचर्य सरणी के रूप में।
  2. ArrayObject रूप में ही है एक std::vector तरह सरणी संख्यात्मक कुंजियों का समर्थन है, और कुछ घनत्व अनुमानी पागल स्मृति उपयोग करता है, तो आप ar[100000000] = 0;
  3. Array करना रोकने के लिए के साथ एक विशेष मामला है, और सभी वस्तुओं को करने के लिए अनुमान प्राप्त देखें कि एक सरणी का उपयोग करने से अधिक समझ आएगी।
  4. कुछ बेहद जटिल है कि मैंने सोचा नहीं है।

वाकई इस सरल अगर वहाँ एक उचित सरणी प्रकार (खांसी WebGL टाइप किया सरणियों खांसी) थे।

+2

यह [आलेख] (http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics) थोड़ा पुराना है, और यह स्पष्ट रूप से कार्यान्वयन की व्याख्या नहीं करता है। हालांकि, यह विस्तृत प्रदर्शन माप करता है, और संभावित कार्यान्वयन का अनुमान लगाता है। –

+2

ऐरे _just_ एक नक्शा नहीं है जिस पर एक 'लम्बाई' संपत्ति है। यदि यह था, तो स्थानांतरित करना या छेड़छाड़ करना इंडेक्सिंग को तोड़ देगा (यानी।एक सरणी से एक मान को स्थानांतरित करें, और यह अभी भी इंडेक्स 0 पर शुरू होता है, न कि 1)। तो कम से कम थोड़ा और चल रहा है। (यह नहीं कि यह आवश्यक रूप से कार्यान्वयन के बारे में कुछ भी कहता है) – Flambino

+1

आप 'आर [0] == ओबी [0] == आर ["0"] == ओबी ["0"] == ar की अपेक्षा क्यों करेंगे। बार == ob.bar' सच होने के लिए? '' a '==' a '==' a'' गलत है क्योंकि यह 'true == 'a' का मूल्यांकन करता है जो 'झूठी' का मूल्यांकन करता है। –

उत्तर

12

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

कहानी का नैतिक: जब आप एक सरणी चाहते हैं, तो एक सरणी का उपयोग करें। जब आप कोई ऑब्जेक्ट चाहते हैं, तो ऑब्जेक्ट का उपयोग करें।

ओह, एक jsval एक प्रकार का विविध प्रकार है जो 64 बिट सी प्रकार में किसी भी संभावित जावास्क्रिप्ट मान का प्रतिनिधित्व कर सकता है।

6

वी 8 और कारकन (और संभवतः चक्र) में, सभी (गैर-होस्ट) ऑब्जेक्ट्स (दोनों जो सरणी हैं और जो नहीं हैं) जिनके नाम सरणी इंडेक्स हैं (जैसा कि ईएस 5 में परिभाषित किया गया है) को संग्रहीत किया जाता है या तो एक घने सरणी (एक सी सरणी जिसमें कुछ मूल्य रैपर होता है) या एक स्पैस सरणी (जिसे बाइनरी सर्च ट्री के रूप में कार्यान्वित किया जाता है)।

एकीकृत ऑब्जेक्ट प्रस्तुति इस बात से पता चलता है कि यह गणना आदेश को प्रभावित करता है: किसी ऑब्जेक्ट के साथ, स्पाइडरमोन्की और गिलहरीफिश दोनों सम्मिलन आदेश में सभी गुण देते हैं; और एक सरणी के साथ, वे सामान्य रूप से (कम से कम एसएम में विशेष मामले हैं!) सरणी अनुक्रमणिका पहले प्रविष्टि आदेश में अन्य सभी गुण। वी 8, कारकन, और चक्र हमेशा ऑब्जेक्ट प्रकार के बावजूद, प्रविष्टि आदेश में सभी अन्य गुणों को सरणी इंडेक्स देते हैं।

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