2011-12-25 10 views
30

में सरणी की चाबियों के रूप में स्ट्रिंग्स स्ट्रिंग का उपयोग सरणी की चाबियों के रूप में क्यों करते हैं, कंसोल इन घोषित मानों के बिना सरणी दिखा रहा है और इस मानों के पुनरावृत्ति के दौरान जहां कुंजी स्ट्रिंग प्रदर्शित नहीं होती हैं? , हालांकि मैं उनके मूल्य प्राप्त कर सकते हैं।जावास्क्रिप्ट

>> var arr = [ 0, 1, 2, 3 ]; 
    undefined 

>> arr["something"] = "aught"; 
    "aught" 

>> arr 
    [0, 1, 2, 3] 

>> arr["something"] 
    "aught" 

>> for(var i = arr.length; i--; console.log(arr[ i ])); 
    3 
    2 
    1 
    0 

मैं समझता हूँ कि सरणियों वस्तुओं जो जावास्क्रिप्ट के इंजन में 'की गणना' इंटरफेस किसी तरह लागू किया गया है कर रहे हैं। सबसे दिलचस्प बात यह है कि दुभाषिया या तो चेतावनी या त्रुटि फेंक नहीं रहा है, इसलिए मैंने कुछ समय बिताया कि डेटा कहां खोया जा सकता है। मैं अब, मैं गलत था और मैं {}

उत्तर

69

के बजाय [] इस्तेमाल किया जावास्क्रिप्ट में सरणियों के 2 प्रकार देखते हैं: मानक सरणियों और साहचर्य सरणियों

  • [ ] - मानक सरणी - 0 आधारित पूर्णांक अनुक्रमित केवल
  • { } - साहचर्य सरणी - javascript ऑब्जेक्ट जहां कुंजी किसी भी तार हो सकता है

तो जब आप को परिभाषित:

var arr = [ 0, 1, 2, 3 ]; 

आप एक मानक सरणी को परिभाषित कर रहे हैं जहां इंडेक्स केवल पूर्णांक हो सकते हैं। जब आप arr["something"]something (जो आप इंडेक्स के रूप में उपयोग करते हैं) के बाद करते हैं तो यह एक पूर्णांक नहीं है जिसे आप मूल रूप से arr ऑब्जेक्ट (प्रत्येक चीज जावास्क्रिप्ट में ऑब्जेक्ट) में परिभाषित कर रहे हैं। लेकिन आप मानक सरणी में कोई तत्व नहीं जोड़ रहे हैं।

+2

@बुडुबा, क्योंकि इसमें कुछ भी गलत नहीं है :-) आपका कोड पूरी तरह से मान्य जावास्क्रिप्ट है। यह पाठक के लिए संदिग्ध है क्योंकि आप 2 प्रकार के सरणी मिश्रण कर रहे हैं लेकिन यह मान्य है। आप दुभाषिया को यह इंगित करना चाहते हैं कि कुछ भी गलत होने पर कुछ गलत है। –

+18

यह ज्यादातर शब्दावली मुद्दा है, लेकिन जावास्क्रिप्ट आमतौर पर '{}' एक सहयोगी सरणी नहीं कहता है। वे इसे एक वस्तु कहते हैं जिसमें गुण होते हैं। क्या अधिकांश लोग इस बात से सहमत नहीं हैं कि जावास्क्रिप्ट ऑब्जेक्ट को एक सहयोगी सरणी कहकर चीजों को भ्रमित नहीं करना सबसे अच्छा है? – jfriend00

+1

नोट: यदि आप '' object.defineProperty.call (arr, 'something', 'aught') जैसे सरणी पर 'defineProperty'' का उपयोग करने का प्रयास करते हैं, तो यह एक त्रुटि फेंक देगा। – David

9

for(var i = arr.length; i--; console.log(arr[ i ]));

यह केवल आप निश्चित रूप से संख्यात्मक सूचकांक, दे देंगे, लेकिन आप कर सकते हैं अभी भी दोनों संख्यात्मक सूचकांक और इस तरह अपने सरणी के स्ट्रिंग चाबियाँ पर पाश:

for (var x in arr) { 
    console.log(x + ": " + arr[x]); 
} 
/* (console output): 
    0: 0 
    1: 1 
    2: 2 
    3: 3 
    something: aught 
*/ 
+1

तो, इस 'Array.prototype.somethingCool = "वास्तव में नहीं" जोड़ें; और फिर अपना फॉर-इन-लूप चलाएं !! – KhaledMohamedP