2010-05-29 7 views
5

मैं इस परीक्षण के लिए Google क्रोम का उपयोग कर रहा हूं: अंतर्ज्ञान के विपरीत, पहला पाश अलर्ट "स्ट्रिंग" 3 बार होता है, जबकि दूसरा पाश अलर्ट "संख्या" 3 बार होता है।मानों पर पुनरावृत्ति करते समय, मान एक संख्या है जब टाइपऑफ (मान) वापसी "स्ट्रिंग" क्यों करता है? जावास्क्रिप्ट

numarray = [1, 2, 3]; 

//for-each loop 
for(num in numarray) 
    alert(typeof(num)); 

//standard loop 
for(i=0; i<numarray.length; i++) 
    alert(typeof(numarray[i])); 

मैं दोनों लूप को "संख्या" को 3 बार सतर्क करने की उम्मीद कर रहा था। जावास्क्रिप्ट में लागू पहला लूप कैसा है? दूसरे शब्दों में, यदि प्रत्येक के लिए सिंटैक्टिक चीनी है, तो मानक लूप का उपयोग करके इसका समतुल्य क्या है?

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

+0

यह आईई में भी 'स्ट्रिंग' अलर्ट करता है। – Senthil

+0

संभावित डुप्लिकेट [क्या जावास्क्रिप्ट सरणी इंडेक्स एक स्ट्रिंग या एक पूर्णांक है?] (Http://stackoverflow.com/q/27537677/1048572) – Bergi

उत्तर

6

कारण आप "स्ट्रिंग" अपनी पहली पाश में लौटे देख रहे हैं कि numसरणी सूचकांक, नहीं है कि सूचकांक में numarray का मूल्य को दर्शाता है। typeof num के बजाय num को अलर्ट करने के लिए अपना पहला पाश बदलने का प्रयास करें और आप देखेंगे कि यह 0, 1, और 2 थूकता है, जो कि आपके सरणी के मान नहीं हैं।

जब आप for in लूप का उपयोग करते हैं, तो आप किसी ऑब्जेक्ट के गुणों पर पुनरावृत्ति कर रहे हैं, जो कि आपके दूसरे उदाहरण में for लूप के बराबर नहीं है। जावास्क्रिप्ट में Arrays वास्तव में सिर्फ अनुक्रमिक संख्याओं के साथ संपत्ति नाम के रूप में वस्तुओं हैं। उन्हें typeof तक स्ट्रिंग के रूप में माना जाता है।

संपादित करें:

मैथ्यू बताते हैं के रूप में, आप जब एक for in पाश का उपयोग कर किसी विशेष क्रम में सरणी में आइटम प्राप्त करने की गारंटी नहीं कर रहे हैं, और आंशिक रूप से है कि कारण के लिए, यह पुनरावृति करने के लिए सिफारिश नहीं कर रहा है उस तरह से सरणी के माध्यम से।

फिलिप-एफकेयू पूछता है कि यह व्यवहार for in का उपयोग करने के लिए उपयोगी होगा, इस व्यवहार को देखते हुए। एक उदाहरण यह है कि जब संपत्ति के नामों का अर्थ होता है, जो वास्तव में सरणी इंडस्ट्रीज के मामले में नहीं है। उदाहरण के लिए:

var myName = { 
    first: 'Jimmy', 
    last: 'Cuadra' 
}; 

for (var prop in myName) { 
    console.log(prop + ': ' + myName[prop]); 
} 

// prints: 
// first: Jimmy 
// last: Cuadra 

यह भी ध्यान देने योग्य बात है कि for in छोरों भी वस्तु के प्रोटोटाइप श्रृंखला के गुणों के माध्यम से पुनरावृति जाएगा लायक है। इस कारण से, यह आमतौर पर है कि कैसे आप एक for in पाश का निर्माण करना चाहते हैं:

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
    // do something 
    } 
} 

यह एक जांच को देखने के लिए करता है तो संपत्ति वस्तु ही है और नहीं एक वस्तु यह प्रोटोटाइप के माध्यम से से इनहेरिट है द्वारा परिभाषित किया गया था जंजीर।

+2

कोई गारंटी नहीं है कि सरणी तत्वों का क्रम में दौरा किया जाएगा। एमडीसी में [के लिए ... में] (https://developer.mozilla.org/en/core_javascript_1.5_reference/Statements/for...in) देखें: "किसी सरणी पर पुनरावृत्ति संख्यात्मक क्रम में तत्वों पर नहीं जा सकती है"। यह मुख्य कारण है ..in आमतौर पर सरणी के लिए अनुशंसित नहीं है। –

+0

+1 @ जिमी: स्पष्टीकरण के लिए धन्यवाद। – Senthil

+0

दिलचस्प! सी #/जावा से क्या अपेक्षा की जा सकती है .. लेकिन यह लूप के लिए मानक को स्पष्ट रूप से लिखने से बेहतर कैसे है, जब आप सभी को सरणी मानों के बजाय इंडेक्स होते हैं? अर्थात। जब भी आप इंडेक्स प्राप्त कर रहे हों, तब भी आप इसका इस्तेमाल क्यों करेंगे? (मुझे लगता है कि मैं सहयोगी सरणी के लिए उपयोग देख सकता हूं)। –

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