2009-10-02 18 views
81

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

array[Date.getTime()] = value; 

दुभाषिया 0 से सभी तत्वों को अब दृष्टांत होगा? अलग-अलग ब्राउज़र अलग-अलग करते हैं?

मुझे याद है कि AIX कर्नेल में एक बग होता था, जो अनुरोध पर छद्म-ttys बना देगा, लेकिन अगर आपने कहा, "echo>/dev/pty10000000000" यह/dev/pty0/देव/पीटी 1, .... और फिर मृत पर गिर जाते हैं। व्यापार शो में यह मजेदार था, लेकिन मैं नहीं चाहता कि यह मेरे ग्राहकों के साथ हो।

+0

क्यों न केवल इसे आज़माएं और क्रैश करें या नहीं। –

+0

@ निकलर्सन: http://jsbin.com/okuze <- कोई क्रैश नहीं ... ;-) – Shog9

+1

ऐसा करने के लिए एक संभावित नकारात्मकता फायरबग में डिबगिंग की कठिनाई है। सरणी पर एक लॉग स्टेटमेंट केवल सरणी में पहले 1000 तत्वों को सूचीबद्ध करेगा, जो सभी "अपरिभाषित" होंगे। इसके अलावा, array.length आपको बताएगा कि आपके सरणी में एन तत्व हैं, भले ही एन -1 केवल "भूत" अपरिभाषित मान हैं। –

उत्तर

33

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

आप विशिष्ट कार्यान्वयन के बारे में अधिक ज्ञान के साथ किसी से पूछना जवाब देने के लिए क्या excatly विरल घने से पारी से चलाता है, लेकिन अपने उदाहरण पूरी तरह से सुरक्षित होना चाहिए। यदि आप घने सरणी प्राप्त करना चाहते हैं, तो आपको कन्स्ट्रक्टर को एक स्पष्ट लंबाई तर्क के साथ कॉल करना चाहिए और आशा है कि आपको वास्तव में एक प्राप्त होगा।

ओलीज द्वारा अधिक विस्तृत विवरण के लिए this answer देखें।

+0

मुझे नहीं लगता कि आपको वास्तव में घने सरणी मिलती है यदि आप कुछ ऐसा कहते हैं जैसे 'foo = new Array (10000) '। हालांकि, यह काम करना चाहिए: 'foo = Array.apply (शून्य, {लंबाई: 10}); '। – Taurus

56

हाँ, वे हैं। वे वास्तव में हैश टेबल आंतरिक रूप से हैं, इसलिए आप न केवल बड़े पूर्णांक बल्कि स्ट्रिंग्स, फ्लोट्स या अन्य ऑब्जेक्ट्स का भी उपयोग कर सकते हैं। हैश में जोड़े जाने से पहले सभी कुंजियां toString() के माध्यम से तारों में परिवर्तित हो जाती हैं। आप कुछ परीक्षण कोड के साथ इस बात की पुष्टि कर सकते हैं:

<script> 
    var array = []; 
    array[0] = "zero"; 
    array[new Date().getTime()] = "now"; 
    array[3.14] = "pi"; 

    for (var i in array) { 
     alert("array["+i+"] = " + array[i] + ", typeof("+i+") == " + typeof(i)); 
    } 
</script> 

प्रदर्शित करता है:

array[0] = zero, typeof(0) == string 
array[1254503972355] = now, typeof(1254503972355) == string 
array[3.14] = pi, typeof(3.14) == string 

सूचना कैसे मैं for...in वाक्य रचना है, जो केवल आप सूचकांक है कि वास्तव में निर्धारित किए जाते हैं देता है इस्तेमाल किया। यदि आप अधिक सामान्य for (var i = 0; i < array.length; ++i) पुनरावृत्ति की शैली का उपयोग करते हैं तो आपको स्पष्ट रूप से गैर-मानक सरणी सूचकांक में समस्याएं आती हैं।

+0

क्या सरणी सामान्य "गुण" तंत्र में उस स्टोर इंडेक्स/मानों के साथ एक नियमित जेएस ऑब्जेक्ट हैं? आपका कोड यही सुझाव देता है। मुझे लगता है कि ऑब्जेक्ट केक पर आईसीइंग के रूप में, एक जेएस सरणी में कुछ अतिरिक्त प्रोटोटाइप विधियां हैं? – Matt

+5

अधिकांश जेएस कार्यान्वयन यदि संभव हो तो वास्तविक सरणी में संख्यात्मक रूप से अनुक्रमित गुणों को संग्रहीत करते हैं; यह पीछे के दृश्य जादू है, हालांकि: एक भाषा दृष्टिकोण से, सरणी नियमित रूप से एक जादू की लंबाई 'संपत्ति' – Christoph

+0

के साथ नियमित वस्तुएं होती हैं 'इन ... वाक्य' में जादू भी होता है जो 'लंबाई' जैसी चीज़ों को छुपाता है ताकि आप केवल सरणी सूचकांक पर पुनरावृत्त करें और सरणी के गुण या विधियों को नहीं। लोगों की एक आम समस्या 'ऑब्जेक्ट.प्रोटोटाइप' या 'ऐरे.प्रोटोटाइप' में चीजें जोड़ रही है जो तब सभी 'लूप इन ... लूप' को तोड़ देती है क्योंकि इन अतिरिक्त गुणों/विधियों को छुपाया नहीं जाता है। –

7

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

+3

जो एक भाषा दृष्टिकोण से है; कार्यान्वयन वास्तव में घने संख्यात्मक गुणों को संग्रहीत करने के लिए असली सरणी का उपयोग करते हैं – Christoph

8

आप बात की इस तरह के लिए बनाया गया एक जावास्क्रिप्ट वाक्य रचना का उपयोग करके समस्या से बचने के सकता है। आप इसे एक शब्दकोश के रूप में देख सकते हैं, फिर भी "के लिए ... में ..." वाक्यविन्यास आपको उन सभी को पकड़ने देगा।

var sparse = {}; // not [] 
sparse["whatever"] = "something"; 
1

सामान्य में, जावास्क्रिप्ट में सरणियों विरल हैं, लेकिन हम उन्हें के रूप में घने बनाने के साथ ही कर सकते हैं:

खाली सरणी:

var a = new Array(3); 
> a 
[ , , ] 
> a.length 
3 
> a[0] 
undefined 
+0

इस उत्तर पर स्वरूपण थोड़ा उलझन में आता है, जिससे आप इसका मतलब समझना मुश्किल बनाते हैं। क्या आप इसे संशोधित करना चाहते हैं? – ivanreese

+1

लेकिन आपके उदाहरण में सरणी "स्पैस" नहीं है। – Taurus

-6

आप HTML5 localStorage या sessionStorage उपयोग कर सकते हैं।

var date=Date.getTime(),value='1234567890'; 
date=date.toString(); 
localStorage.setItem(date, value); 

* सत्र स्टोरेज ऑब्जेक्ट स्थानीय स्टोरेज ऑब्जेक्ट के बराबर है, सिवाय इसके कि यह केवल एक सत्र के लिए डेटा संग्रहीत करता है। जब उपयोगकर्ता विशिष्ट ब्राउज़र टैब बंद करता है तो डेटा हटा दिया जाता है। अधिक जानने के लिए w3schools.com

+2

प्रश्न: "जावास्क्रिप्ट सरणी स्पैस हैं?" उत्तर: "आप एचटीएमएल 5 स्थानीय स्टोरेज या सत्र स्टोरेज का उपयोग कर सकते हैं।" उम्म क्या?!?!?! –

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