2012-03-02 14 views
31

नीचे दिए गए उदाहरण में, array2.length केवल दस है, जब मेरे दिमाग में, यह होना चाहिए 13. "स्ट्रिंग कीड" इंडेक्स सरणी की लंबाई क्यों नहीं बढ़ाता है? मैं चीजों को स्टोर कर सकता हूं और अभी भी इसे एक्सेस कर सकता हूं, और वीएस डीबगर दिखाता है कि उन सरणी को ठीक से संग्रहीत किया जा रहा है। तो लंबाई क्यों नहीं बढ़ी है?जावास्क्रिप्ट सरणी में एक स्ट्रिंग इंडेक्स लंबाई आकार में वृद्धि क्यों नहीं करता है?

var array2 = new Array(); 
array2["a"] = new Array(); 
array2["b"] = new Array(); 
array2["c"] = new Array(); 
for (var i = 0; i < 10; ++i) 
    array2[i] = new Array(); 

var nothing = ""; 
for (var i = 0; i < array2.length; ++i) 
    nothing = ""; 
+0

संभावित डुप्लिकेट http://stackoverflow.com/questions/5223/length-of-javascript-associative-array – scibuff

उत्तर

72

जावास्क्रिप्ट सरणी में "स्ट्रिंग इंडेक्स" नहीं हो सकता है। एक जावास्क्रिप्ट Array विशेष रूप से संख्यात्मक रूप से अनुक्रमित है। जब आप "स्ट्रिंग इंडेक्स" सेट करते हैं, तो आप ऑब्जेक्ट की प्रॉपर्टी सेट कर रहे हैं। ये समकक्ष हैं:

array.a = 'foo'; 
array['a'] = 'foo'; 

वे गुण सरणी के "डेटा संग्रहण" का हिस्सा नहीं हैं। ,

// numerically indexed Array 
var array = ['foo', 'bar', 'baz']; 

// associative Object 
var dict = { foo : 42, bar : 'baz' }; 
+5

ठीक है, निष्पक्ष होने के लिए, संख्यात्मक अनुक्रमणिका भी वस्तु के गुण हैं। यदि आप किसी संख्या का उपयोग करने के बजाय इंडेक्स के स्ट्रिंग प्रस्तुति का उपयोग करते हैं तो Arrays ठीक काम करते हैं: 'var xs = [10, 20, 30]; console.log (xs ['1']); ' – hugomg

+3

वैसे हाँ, यह इस तथ्य पर वापस चला जाता है कि जावास्क्रिप्ट में लगभग हर चीज एक वस्तु है एक कार्य एक वस्तु है और' .' नोटेशन और '[] 'नोटेशन ऑब्जेक्ट गुणों का उपयोग करने के लिए वास्तव में वही हैं। फिर भी, 'ऐरे' ऑब्जेक्ट पर "स्ट्रिंग इंडेक्स" सेट करना 'ऐरे' ऑब्जेक्ट की सरणी विशेषताओं का उपयोग नहीं कर रहा है। – deceze

+0

हालांकि यह सरणी और वस्तु जैसा दिखता है लेकिन अंतर प्रोटोटाइप विधियों के संदर्भ में है जो हम सरणी के साथ प्राप्त करते हैं, वस्तु के समान नहीं है। हम वस्तुओं के साथ 'पुश', 'unshift' आदि जैसे विधियों का उपयोग नहीं कर सकते हैं। – shubhamkes

7

आप सरणी में आइटम नहीं जोड़ रहे हैं; आप Array ऑब्जेक्ट में गुण जोड़ रहे हैं।

2

"स्ट्रिंग कीड" इंडेक्स इंडेक्स नहीं हैं, लेकिन गुण। array2["a"]array2.a कहने जैसा ही है। याद रखें कि आप जावास्क्रिप्ट में किसी भी प्रकार के चर पर गुण सेट कर सकते हैं, जो वास्तव में आप यहां कर रहे हैं।

+0

आप 'शून्य', 'अपरिभाषित' पर गुण सेट नहीं कर सकते हैं: पी। इसके अलावा, कुछ बुराई आईई ब्राउज़र ऑब्जेक्ट्स आपको उन पर कस्टम गुण सेट करने या प्राप्त करने की अनुमति नहीं देते हैं। – hugomg

10

क्योंकि लंबाई defined to be एक प्लस सरणी में सबसे बड़ी संख्यात्मक सूचकांक है।

var xs = []; 
xs[10] = 17; 
console.log(xs.length); //11 

इस कारण से, आप केवल सरणियों संख्या द्वारा अनुक्रमित चीजों के भंडारण, सादे वस्तुओं का उपयोग कर आप कुंजी के रूप में तार का उपयोग करना चाहते बजाय अगर के लिए उपयोग करना चाहिए। इसके अलावा, एक sidenote के रूप में, और new Object के बजाय [] या {} जैसे अक्षरों का उपयोग करना बेहतर अभ्यास है।

1

जैसा कि ऊपर कहा:

var obj = {}; 
obj['a'] = 'foo'; 

शायद सबसे सरल दृश्य के बजाय शाब्दिक अंकन new Array उपयोग कर रहा है:

यदि आप चाहते हैं "साहचर्य सरणियों", आप किसी चीज़ का इस्तेमाल करने की जरूरत है सहयोगी सरणी के लिए वस्तु का उपयोग करें।

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

var myArray = []; 
myArray["foo"] = "bar"; //works 
console.log(myArray["foo"]) //print "bar" 
myArray["length"] = "baz" //crash with a "RangeError: Invalid array length" 

है ऐसा इसलिए है क्योंकि आप length विशेषता स्थान ले रही हैं स्ट्रिंग के साथ एक सरणी का, जो अमान्य है।

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