जावास्क्रिप्ट के लिए ... में बनाम के लिए


461

क्या आपको लगता है कि इसमें और लूप के लिए ... में एक बड़ा अंतर है? आप किस तरह के "के लिए" का उपयोग करना पसंद करते हैं और क्यों?

मान लें कि हमारे पास सहयोगी सरणियों की एक सरणी है:

var myArray = [{'key': 'value'}, {'key': 'value1'}];

तो हम पुनरावृति कर सकते हैं:

for (var i = 0; i < myArray.length; i++)

तथा:

for (var i in myArray)

मुझे बड़ा अंतर नहीं दिखता। क्या कोई प्रदर्शन मुद्दे हैं?


13
नोट हम भी, कि जे एस 1.6 के रूप में , है: myArray.forEach(callback[, thisarg])
बेन्जी XVI

14
@Benji array.forEach वास्तव में ES5 में है।
मिकमेकाना 20

2
इन-लूप के लिए आपको एक सशर्त की आवश्यकता होती है जो इस तरह दिखाई देती है:if(myArray.hasOwnProperty(i)){true}
एरिक होडोंस्की

6
['foo', 'bar', 'baz'].forEach(function(element, index, array){ console.log(element, index, array); }); IE8- को छोड़कर हर जगह बहुत अधिक उपयोग करना ठीक है और यह अब तक का सबसे सुंदर वाक्यविन्यास है
जॉन z

5
ईसीएमएस्क्रिप्ट 6for...of में भी कथन है , उदाहरण के लिए:for (let i of myArray) console.log(i);
विटाली फेडोरेंको

जवाबों:


548

चुनाव इस बात पर आधारित होना चाहिए कि किस मुहावरे को सबसे अच्छा समझा जाता है।

एक सरणी का उपयोग करके पुनरावृत्त किया जाता है:

for (var i = 0; i < a.length; i++)
   //do stuff with a[i]

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

for (var key in o)
  //do stuff with o[key]

जब तक आपके पास पृथ्वी बिखरने का कारण नहीं है, उपयोग के स्थापित पैटर्न से चिपके रहें।


38
यह उल्लेख किया जाना चाहिए कि यह कथन के लिए फ़िल्टरिंग के साथ ... का उपयोग करने के लिए एक अच्छा अभ्यास है। ऑब्जेक्ट का एक आसान तरीका है "obj.hasOwnProperty (सदस्य)" जो यह जांचता है कि क्या इटर्मीटर द्वारा लौटाया गया सदस्य वास्तव में ऑब्जेक्ट का सदस्य है। देखें: javascript.crockford.com/code.html
दामिर ज़ेकीक

57
जैसा कि एक अन्य उत्तर (ओं) में टिप्पणी की गई है, "के लिए ... में" Arrays के लिए सही ढंग से काम नहीं करता है, क्योंकि यह सभी ऐरे गुणों और विधियों पर पुनरावृति करेगा। इस प्रकार, आपको ऑब्जेक्ट गुणों पर केवल पुनरावृत्ति के लिए "के लिए ..." का उपयोग करना चाहिए। अन्यथा, "के लिए छड़ी (मैं = 0; मैं <कुछ? मैं ++)"
डेनिलसन सा माया

प्रदर्शन कारणों के लिए, IMO से पहले सरणी की लंबाई का मूल्यांकन करना बेहतर है for, लूप में हर बार.लगाना का मूल्यांकन न करें।
अप'क्रिक

9
@UpTheCreek: यह निश्चित रूप से सच है जब सरणी वास्तव में HTMLDOM द्वारा लौटाई गई कुछ है, हालांकि, मुझे आश्चर्य है कि एक प्रशंसनीय अंतर देखने से पहले एक मानक जावास्क्रिप्ट सरणी कितना बड़ा होना चाहिए? व्यक्तिगत रूप से मैं कोड को यथासंभव सरल रखूंगा जब तक कि कुछ अलग करने के लिए आवश्यक साबित न हो।
एंथनीवजोन

2
@Pichan मुझे लगता है कि आप का मतलब है i < l, नहीं i < a, आपके फॉर-लूप कंडीशन में।
मैक्स नानसी Max

161

डगलस क्रॉफोर्ड ने जावास्क्रिप्ट में सिफारिश की है :for in कथन का उपयोग करने से बचने के लिए अच्छे भाग (पृष्ठ 24) ।

यदि आप for inकिसी ऑब्जेक्ट में प्रॉपर्टी के नामों पर लूप का उपयोग करते हैं, तो परिणाम का आदेश नहीं दिया जाता है। इससे भी बदतर: आपको अप्रत्याशित परिणाम मिल सकते हैं; इसमें प्रोटोटाइप श्रृंखला से विरासत में मिले सदस्य और विधियों का नाम शामिल है।

सब कुछ लेकिन गुणों के साथ फ़िल्टर किया जा सकता है .hasOwnProperty। यह कोड नमूना वही करता है जो आप मूल रूप से चाहते थे:

for (var name in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, name)) {
        // DO STUFF
    }
}

70
के लिए ... पूरी तरह से वस्तु गुणों पर पाशन के लिए उपयुक्त है। यह सरणी तत्वों पर लूपिंग के लिए उपयुक्त नहीं है। यदि आप इन परिदृश्यों के बीच अंतर नहीं समझ सकते हैं, तो हाँ, आपको इसके लिए बचना चाहिए ... में; अन्यथा, पागल हो जाओ।
शोग

8
इस तथ्य पर जोर देना चाहते हैं कि यह आदेश नहीं है! यह एक बड़ी समस्या हो सकती है, और इसे पकड़ना मुश्किल बग होगा।
जेसन

4
+1 के लिए "इसमें प्रोटोटाइप श्रृंखला से विरासत में मिले सदस्य और विधियों का नाम शामिल है।" उदाहरण के लिए, यदि कोई आपके कोड को प्रोटोटाइप लोडेड (भले ही आपका कोड वास्तव में इसका उपयोग नहीं करता है) के साथ उपयोग करने के लिए होता है, तो आपको मज़ा आएगा।
आईजी

13
कृपया करने के लिए मत भूलना घोषितname चर: for(var name in object)...,, अन्यथा अगर उस कोड उदाहरण के लिए एक समारोह के अंदर है, nameऊपर वैश्विक वस्तु (एक करने के लिए एक काम की संपत्ति जा रहा है चर अंत अघोषित पहचानकर्ता भी नए ECMAScript में, करता है कि) 5 सख्त मोड, उस कोड को फेंक देंगे ReferenceError
सीएमएस

6
@ नोसेरेडना: क्रोम के लिए पुनरावृति के आदेश के बारे में एक समस्या है, जो जॉन रेसिग के अलावा किसी और ने दायर नहीं की है, जिसे वोंटफ़िक्स के रूप में चिह्नित किया गया है। code.google.com/p/chromium/issues/detail?id=883 । क्रोम से पहले भी, यदि आप हटाते हैं और फिर से एक संपत्ति जोड़ते हैं, तो पुनरावृत्ति का क्रम ब्राउज़रों में समान नहीं था। इसके अलावा IE 9 क्रोम की तरह व्यवहार करता है (गति में सुधार के लिए माना जाता है)। इसलिए ... कृपया गलत जानकारी फैलाना बंद करें, आप इसके आधार पर बहुत भोले रहेंगे।
जुआन मेंडेस

62

FYI करें - jQuery उपयोगकर्ता


jQuery की each(callback)विधि for( ; ; )डिफ़ॉल्ट रूप से लूप का उपयोग करती है , और for( in ) केवल तभी उपयोग करेगी जब लंबाई हो undefined

इसलिए, मैं कहूंगा कि इस फ़ंक्शन का उपयोग करते समय सही क्रम मान लेना सुरक्षित है।

उदाहरण :

$(['a','b','c']).each(function() {
    alert(this);
});
//Outputs "a" then "b" then "c"

इसका उपयोग करने का नकारात्मक पक्ष यह है कि यदि आप कुछ गैर यूआई तर्क कर रहे हैं, तो आपके कार्य अन्य रूपरेखाओं के लिए कम पोर्टेबल होंगे। each()समारोह शायद सबसे अच्छा jQuery चयनकर्ताओं के साथ प्रयोग के लिए आरक्षित है और for( ; ; )अन्यथा उचित हो सकता है।



4
हमेशा documentcloud.github.com/underscore है जिसमें _.each और कई अन्य उपयोगी कार्य हैं
w00t

1
इसका मतलब यह भी है कि अगर मेरे पास $ ऑब्जेक्ट में लंबाई संपत्ति है। तो असफल हो जाएगी? उदाहरण के लिए x = {a: "1", b: "2", लंबाई: 3}।
ओनूर टोपल

29

आप किस प्रकार के लूप का उपयोग करते हैं और किस ब्राउज़र पर निर्भर करते हैं, इसके आधार पर प्रदर्शन अंतर हैं।

उदाहरण के लिए:

for (var i = myArray.length-1; i >= 0; i--)

कुछ ब्राउज़रों की तुलना में लगभग दोगुना तेज़ है:

for (var i = 0; i < myArray.length; i++)

हालाँकि जब तक आपके सरणियाँ बड़ी नहीं होती हैं या आप उन्हें लगातार लूप देते हैं, तब तक वे सभी पर्याप्त तेज़ होते हैं। मुझे गंभीरता से संदेह है कि सरणी लूपिंग आपकी परियोजना में एक अड़चन है (या उस मामले के लिए किसी अन्य परियोजना के लिए)


5
लूपिंग से पहले "myArray.length" को एक वैरिएबल में स्टोर करने से प्रदर्शन का अंतर खत्म हो जाएगा? मेरा अनुमान है "हाँ"।
तोलक

3
नंबर 'myArray.length' एक संपत्ति है, न कि किसी वस्तु पर एक विधि - इसके मूल्य को निर्धारित करने के लिए कोई गणना नहीं की जाती है। एक वैरिएबल में इसके मूल्य को संग्रहीत करना कुछ भी नहीं करेगा।
जेसन

3
हाँ वहाँ है। गुण चर नहीं हैं; उन्हें कोड प्राप्त / सेट करना है।
काएं

12
मैं उपयोग करता हूंfor(var i = myArray.length; i--;)
केविन

2
स्पष्टता और पठनीयता के लिए कोड। कुछ ब्राउज़रों में मामूली तेजी से दौड़ने के लिए क्या होता है जब वर्तमान समय में बेतुके बड़े पैमाने पर सरणियों का उपयोग किया जाता है। अनुकूलन बदल सकते हैं, लेकिन आपके कोड की पठनीयता (या उसके अभाव) नहीं होगी। ऐसा कोड लिखें जिसे दूसरे आसानी से फॉलो कर सकें, और ऑप्टिमाइज़र को अपने नियत समय में पकड़ने दें।
आरोह

26

ध्यान दें कि मूल Array.forEach विधि अब व्यापक रूप से समर्थित है


2
यह क्या करता है? क्या इसमें अन्य पदों (सरणी के तत्वों के बजाय गुणों पर लूपिंग) में वर्णित समस्याएं हैं? इसके अलावा, जैसा कि IE8 इसका समर्थन नहीं करता है, यह व्यापक रूप से समर्थित है, यह कहना थोड़ा खिंचाव है।
रौनी लिलेट्स

2
के रूप में ज्यादा के रूप में * निक्स उपयोगकर्ताओं को यह घृणा, IE8 सभी उप windows7 उपयोगकर्ताओं के सबसे है। ब्राउज़र बाजार का एक बड़ा हिस्सा thats।
18

2
@Rauni - मैं आपकी बात लेती हूं, लेकिन en.wikipedia.org/wiki/Usage_share_of_web_browsers#Summary-for के अनुसार, और मार्केटशेयर के अनुसार । कम से कम 8% ब्राउज़र IE 9. दूसरे शब्दों में, Array.forEach को लगभग 70% डेस्कटॉप ब्राउज़र द्वारा समर्थित किया गया है, इसलिए मुझे नहीं लगता कि 'व्यापक रूप से समर्थित' अनुचित है। मैंने जाँच नहीं की है, लेकिन मोबाइल समर्थन (WebKit और ओपेरा ब्राउज़र पर) और भी अधिक हो सकता है। जाहिर है, भौगोलिक रूप से काफी भिन्नताएं हैं।
सैम डटन

1
अद्यतन के लिए धन्यवाद। मैं मानता हूं कि यह कहा जा सकता है कि यह "व्यापक रूप से समर्थित" है। केवल समस्या यह है कि यदि उपयोगकर्ता इस JS विधि का उपयोग करता है, तो उसे अभी भी केस के लिए बैक-अप विधि लिखनी है यदि वह समर्थित नहीं है ..
Rauni Lillemets

1
@ राउनी - आप स्वचालित रूप से बैकअप तरीके प्रदान करने के लिए es5-shim और es6-shim का उपयोग कर सकते हैं। github.com/es-shims/es5-shim
मिचेल वैन डेर ब्लोंक

24

सभी प्रमुख ब्राउज़रों के 2012 वर्तमान संस्करण के लिए अपडेट किए गए उत्तर - क्रोम, फ़ायरफ़ॉक्स, IE9, सफारी और ओपेरा ES5 के मूल array.forEach का समर्थन करते हैं।

जब तक आपके पास IE8 को मूल रूप से समर्थन करने का कोई कारण नहीं है (इन उपयोगकर्ताओं को ध्यान में रखते हुए ES5- शिम या क्रोम फ्रेम प्रदान किया जा सकता है, जो एक उचित JS वातावरण प्रदान करेगा), यह केवल भाषा के उचित सिंटैक्स का उपयोग करने के लिए क्लीनर है:

myArray.forEach(function(item, index) {
    console.log(item, index);
});

Array.forEach () के लिए पूर्ण प्रलेखन MDN पर है।


1
आपको वास्तव में कॉलबैक के मापदंडों का दस्तावेजीकरण करना चाहिए: पहला तत्व मान, दूसरा तत्व सूचकांक, तीसरा सरणी का पता
लगाया

मैं सुनता हूं कि आप क्या कह रहे हैं, लेकिन इस मामले में यह ओवरसाइम्प्लाइज़ होने की संभावना की पूरी श्रृंखला को अस्पष्ट करता है। इंडेक्स और वैल्यू दोनों होने का मतलब है कि यह बोनस के साथ ... के लिए और इन दोनों के लिए एक प्रतिस्थापन के रूप में काम कर सकता है।
1

1
@Cory: ES5 forEach को काफी आसानी से विरासत ES3 ब्राउज़रों में जोड़ा जा सकता है। कम कोड बेहतर कोड है।
मिकमेकाना 11

2
@nailer क्या यह सरणियों और वस्तुओं पर इस्तेमाल किया जा सकता है?
हितुटोडेस्ट्रक्ट

1
@hitautodestruct यह ऐरे के प्रोटोटाइप का हिस्सा है, ऑब्जेक्ट का नहीं। आम तौर पर इस समुदाय में अभी भी गैर-ऐरे वस्तुओं को 'फॉर (ऑब्जेक्ट में कुंजी) {}' के साथ पुनरावृत्त किया जाता है।
मिकमेकाना

14

जब सरणी विरल है, तो दोनों समान नहीं हैं।

var array = [0, 1, 2, , , 5];

for (var k in array) {
  // Not guaranteed by the language spec to iterate in order.
  alert(k);  // Outputs 0, 1, 2, 5.
  // Behavior when loop body adds to the array is unclear.
}

for (var i = 0; i < array.length; ++i) {
  // Iterates in order.
  // i is a number, not a string.
  alert(i);  // Outputs 0, 1, 2, 3, 4, 5
  // Behavior when loop body modifies array is clearer.
}

14

प्रोटोटाइप श्रृंखला को छोड़ने के लिए forEach का उपयोग करना

बस @ नेलर के उत्तर के लिए एक त्वरित परिशिष्ट , Object.keys के साथ forEach का उपयोग करने का अर्थ है कि आप hasOwnProperty का उपयोग किए बिना प्रोटोटाइप श्रृंखला पर पुनरावृति से बच सकते हैं।

var Base = function () {
    this.coming = "hey";
};

var Sub = function () {
    this.leaving = "bye";
};

Sub.prototype = new Base();
var tst = new Sub();

for (var i in tst) {
    console.log(tst.hasOwnProperty(i) + i + tst[i]);
}

Object.keys(tst).forEach(function (val) {
    console.log(val + tst[val]);
});

2
अरे, यह डरपोक है। यह पाने के लिए 50 अन्य पोस्ट पढ़ने लायक था। obj = {"गुलाबी": "बतख", लाल: "गीज़"}; Object.keys (obj) === ["गुलाबी", "लाल"]
Orwellophile

14

मेरा दूसरा मत है कि आपको अपनी आवश्यकता के अनुसार पुनरावृत्ति विधि का चयन करना चाहिए। मैं आपको सुझाव दूंगा कि मूल संरचना के साथ मूल रूप से कभी लूप न करें । यह एक तरह से धीमा है और , जैसा कि चेस सीबेरट ने पहले ही कहा था, प्रोटोटाइप ढांचे के अनुरूप नहीं है।Arrayfor in

विभिन्न लूपिंग शैलियों पर एक उत्कृष्ट बेंचमार्क है जिसे आपको जावास्क्रिप्ट के साथ काम करने पर बिल्कुल देखना चाहिए । शुरुआती अनुकूलन न करें, लेकिन आपको उस सामान को अपने सिर के पीछे कहीं रखना चाहिए।

मैं for inकिसी ऑब्जेक्ट के सभी गुण प्राप्त करने के लिए उपयोग करूंगा , जो आपकी स्क्रिप्ट को डीबग करते समय विशेष रूप से उपयोगी है। उदाहरण के लिए, अपरिचित वस्तु का पता लगाने पर मुझे यह लाइन काम करना पसंद है:

l = ''; for (m in obj) { l += m + ' => ' + obj[m] + '\n' } console.log(l);

यह मेरे फायरबग लॉग में पूरे ऑब्जेक्ट (विधि निकायों के साथ) की सामग्री को डंप करता है। बहुत काम है।


लिंक अब टूट गया है। यकीन है कि बेंचमार्क देखना चाहेंगे, अगर किसी के पास एक और लिंक है।
बिलबद

यह अब टूटा नहीं है।
ओली

प्रोटोटाइप में फॉरच लूप्स टूट जाते हैं? जैसा कि यह अब आमतौर पर समर्थित है, कि कुछ प्रोटोटाइप को हल करना चाहिए।
mvrak

7

यहाँ कुछ मैंने किया है।

function foreach(o, f) {
 for(var i = 0; i < o.length; i++) { // simple for loop
  f(o[i], i); // execute a function and make the obj, objIndex available
 }
}

यह है कि आप इसका उपयोग कैसे करेंगे यह
सरणियों और वस्तुओं पर काम करेगा (जैसे HTML तत्वों की सूची)

foreach(o, function(obj, i) { // for each obj in o
  alert(obj); // obj
  alert(i); // obj index
  /*
    say if you were dealing with an html element may be you have a collection of divs
  */
  if(typeof obj == 'object') { 
   obj.style.marginLeft = '20px';
  }
});

मैंने अभी इसे बनाया है इसलिए मैं सुझावों के लिए खुला हूँ :)


बहुत बढ़िया सामान - बहुत सीधा!
क्रिस

6

मैं अलग-अलग तरीकों का उपयोग करता हूं, जिनके आधार पर मैं आइटम को संदर्भित करना चाहता था।

यदि आप अभी वर्तमान आइटम चाहते हैं तो foreach का उपयोग करें।

रिश्तेदार तुलना करने के लिए यदि आपको एक अनुक्रमणिका की आवश्यकता है, तो इसका उपयोग करें। (यानी यह पिछले / अगले आइटम से कैसे तुलना करता है?)

मैंने कभी किसी प्रदर्शन अंतर पर ध्यान नहीं दिया। मैं इसके बारे में चिंता करने से पहले एक प्रदर्शन मुद्दा होने तक इंतजार करूँगा।


नीचे Bnos उत्तर देखें - के लिए ... वह नहीं कर रहा है जो आप यहाँ उम्मीद करते हैं और यदि आप इसका उपयोग करते हैं तो आप सभी प्रकार के मज़े कर सकते हैं। रिकॉर्ड के लिए, प्रोटोटाइप चीजों को सही तरीके से करता है।
marcus.greasly

4

के साथ (var i in myArray) आप ऑब्जेक्ट्स पर भी लूप कर सकते हैं, मेरे पास कुंजी नाम होगा और आप myArray [i] के माध्यम से संपत्ति तक पहुंच सकते हैं । अतिरिक्त, आपके द्वारा ऑब्जेक्ट में जोड़े गए किसी भी तरीके को लूप में शामिल किया जाएगा, अर्थात, यदि आप किसी बाहरी ढांचे जैसे कि jQuery या प्रोटोटाइप का उपयोग करते हैं, या यदि आप सीधे प्रोटोटाइप में ऑब्जेक्ट को जोड़ने के तरीकों को जोड़ते हैं, तो मैं एक बिंदु पर इंगित करूंगा उन तरीकों।


4

ध्यान रहे!

यदि आपके पास कई स्क्रिप्ट टैग हैं और आप उदाहरण के लिए टैग विशेषताओं में एक जानकारी खोज रहे हैं, तो आपको एक लूप के साथ .length संपत्ति का उपयोग करना होगा क्योंकि यह एक साधारण सरणी नहीं बल्कि HTMLCollection ऑब्जेक्ट है।

https://developer.mozilla.org/en/DOM/HTMLCollection

यदि आप foreach स्टेटमेंट का उपयोग करते हैं (var i in yourList) तो यह अधिकांश ब्राउज़रों में HTMLCollection की तेज़ी और विधियाँ लौटाएगा!

var scriptTags = document.getElementsByTagName("script");

for(var i = 0; i < scriptTags.length; i++)
alert(i); // Will print all your elements index (you can get src attribute value using scriptTags[i].attributes[0].value)

for(var i in scriptTags)
alert(i); // Will print "length", "item" and "namedItem" in addition to your elements!

यहां तक ​​कि अगर getElementsByTagName को एक नोडलिस्ट लौटना चाहिए, तो अधिकांश ब्राउज़र HTMLCollection लौटा रहे हैं: https://developer.mozilla.org/en/DOM/document.getElementsByTagName


3

Arrays पर छोरों के लिए प्रोटोटाइप के साथ संगत नहीं है। यदि आपको लगता है कि आपको भविष्य में उस पुस्तकालय का उपयोग करने की आवश्यकता हो सकती है, तो यह समझ में आता है कि लूप्स के लिए छड़ी करना चाहिए।

http://www.prototypejs.org/api/array


भूल जाओ "आपको उस पुस्तकालय का उपयोग करने की आवश्यकता हो सकती है"। इसके बजाय "अपने जेएस को उस लाइब्रेरी का उपयोग करने वाली किसी भी चीज के साथ शामिल किया जा सकता है" के बजाय सोचें , क्योंकि समस्याएं अभी भी आती हैं।
आईजी

3

मैंने वस्तुओं और प्रोटोटाइप और सरणियों का उपयोग करके "प्रत्येक के लिए" समस्याओं को देखा है

मेरी समझ यह है कि प्रत्येक के लिए वस्तुओं के गुण हैं और सरणियाँ नहीं हैं


3

यदि आप वास्तव में अपने कोड को गति देना चाहते हैं, तो उसके बारे में क्या है?

for( var i=0,j=null; j=array[i++]; foo(j) );

यह कथन के लिए तर्क के भीतर होने की तरह है और यह कम निरर्थक है। साथ ही फायरफॉक्स में Array.forEach और Array.filter हैं


2
यह आपके कोड को गति क्यों देगा? मैं यह नहीं देख सकता कि इस तरह के बयानों को फिर से दर्ज करना क्यों इसे गति देगा।
Rup

3

Jsperf के अनुसार एक छोटा और सबसे अच्छा कोड है

keys  = Object.keys(obj);
for (var i = keys.length; i--;){
   value = obj[keys[i]];// or other action
}

1

समानता का लाभ उठाने के लिए एरे () का प्रयोग करें


4
ब्राउज़र में जावास्क्रिप्ट ईवेंट लूप समवर्ती है इसलिए Array.prototype.forEachसमानांतर में कॉलबैक पर कई कॉल निष्पादित नहीं करेगा।
माइक सैमुअल

1

(;) के लिए एरे के लिए है : [२०,५५,३३]

for..in के लिए है वस्तुओं : {x: 20, वाई: 55: जेड: 33}


0

सावधान रहे!!! मैं मैक ओएस में क्रोम 22.0 का उपयोग कर रहा हूं और मुझे प्रत्येक सिंटैक्स के लिए समस्या हो रही है।

मुझे नहीं पता कि यह एक ब्राउज़र मुद्दा, जावास्क्रिप्ट मुद्दा या कोड में कुछ त्रुटि है, लेकिन यह बहुत अजीब है। वस्तु के बाहर यह पूरी तरह से काम करता है।

var MyTest = {
    a:string = "a",
    b:string = "b"
};

myfunction = function(dicts) {
    for (var dict in dicts) {
        alert(dict);
        alert(typeof dict); // print 'string' (incorrect)
    }

    for (var i = 0; i < dicts.length; i++) {
        alert(dicts[i]);
        alert(typeof dicts[i]); // print 'object' (correct, it must be {abc: "xyz"})
    }
};

MyObj = function() {
    this.aaa = function() {
        myfunction([MyTest]);
    };
};
new MyObj().aaa(); // This does not work

myfunction([MyTest]); // This works

0

दोनों में एक महत्वपूर्ण अंतर है। किसी ऑब्जेक्ट के गुणों पर इसके लिए पुनरावृति होती है, इसलिए जब मामला एक सरणी होता है तो यह न केवल अपने तत्वों पर पुनरावृति करेगा, बल्कि इसके पास "हटाएं" फ़ंक्शन पर भी होगा।

for (var i = 0; i < myArray.length; i++) { 
    console.log(i) 
}

//Output
0
1

for (var i in myArray) { 
    console.log(i) 
} 

// Output
0 
1 
remove

आप इन-इन का उपयोग ए के साथ कर सकते हैं if(myArray.hasOwnProperty(i))। फिर भी, जब सरणियों पर पुनरावृत्ति होती है, तो मैं हमेशा इससे बचना पसंद करता हूं और बस (;;) कथन का उपयोग करता हूं।


0

हालांकि वे दोनों बहुत ही एक जैसे हैं, एक मामूली अंतर है:

var array = ["a", "b", "c"];
array["abc"] = 123;
console.log("Standard for loop:");
for (var index = 0; index < array.length; index++)
{
  console.log(" array[" + index + "] = " + array[index]); //Standard for loop
}

इस मामले में आउटपुट है:

लोड के लिए मानक:

ARRAY [0] = ए

ARRAY [1] = बी

ARRAY [2] = C

console.log("For-in loop:");
for (var key in array)
{
  console.log(" array[" + key + "] = " + array[key]); //For-in loop output
}

जबकि इस मामले में आउटपुट है:

फॉर-लूप:

ARRAY [1] = बी

ARRAY [2] = C

ARRAY [10] = डी

ARRAY [ABC] = 123


0

किसी वस्तु के सभी गुणों के नामों के माध्यम से कथन के लिए अनुमति देता है। दुर्भाग्य से, यह उन सभी सदस्यों के माध्यम से भी चलता है जिन्हें प्रोटोटाइप श्रृंखला के माध्यम से विरासत में मिला था। डेटा सदस्यों में रुचि होने पर विधि कार्यों को पूरा करने का यह दुष्प्रभाव होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.