2014-09-23 3 views
15

में प्रत्येक के लिए और लूप के बीच अंतर मैं सोच रहा हूं: क्या forEach और for जावास्क्रिप्ट में लूप के बीच कोई महत्वपूर्ण अंतर है।जावास्क्रिप्ट

  1. प्रदर्शन: JsPerf के अनुसार:

    var myArray = [1,2,3,4]; 
    
    myArray.forEach(function(value) { 
        console.log(value); 
    }); 
    
    for (var i = 0; i < myArray.length; i++) { 
        console.log(myArray[i]); 
    } 
    

    यहाँ मेरी अनुसंधान का हिस्सा है:

    इस उदाहरण पर विचार foreach पाश के लिए की तुलना में थोड़ी धीमी है।

  2. प्रयोज्यता: कोई भी तरीका नहीं है कि हम प्रत्येक लूप के मामले में कॉलबैक से तोड़ सकते हैं/वापस लौट सकते हैं।

उदाहरण के लिए: आप यह जानना चाहते हैं कि कोई संख्या प्रमुख है या नहीं। मुझे लगता है कि लूप के लिए उपयोग करने के लिए प्रत्येक लूप के लिए उपयोग करने से कहीं अधिक आसान है।

  1. पठनीयता: लूप के लिए उपयोग कोड को कोड के लिए कोड करने से अधिक पठनीय बनाता है।
  2. ब्राउज़र संगतता: आईई < 9 में प्रत्येक समर्थित नहीं है, इसलिए यह हमारे कोड में कुछ शिम पेश करता है।

मेरे प्रश्न हैं:

  1. क्या foreach के फायदे पाश के लिए अधिक कर रहे हैं?
  2. किस परिदृश्य में, प्रत्येक के लिए अधिक बेहतर है।
  3. यह जावास्क्रिप्ट में क्यों आया? इसकी आवश्यकता क्यों थी?
+0

अच्छी तरह से तकनीकी रूप से आप एक त्रुटि फेंक कर प्रत्येक के लिए बाहर निकल सकते हैं .... 1) राय 2) राय 3) राय। – epascarello

+0

@ सिर्को-मुझे लगता है कि आपका मतलब है '[1,2,, 3,4] '। आपकी टिप्पणी में सरणी में पांच सदस्य हैं, * * * * * * प्रत्येक * के लिए सभी पांच आएंगे। हालांकि, यदि एक (या अधिक) सदस्य मौजूद नहीं हैं (एक तथाकथित "स्पैस" सरणी) तो * के लिए * गायब सदस्यों की यात्रा नहीं करेगा। – RobG

+0

@RobG दाएं। अभी सही नहीं हो सकता – Sirko

उत्तर

12

forEachArray प्रोटोटाइप पर एक विधि है। यह एक सरणी के प्रत्येक तत्व के माध्यम से पुनरावृत्त करता है और इसे कॉलबैक फ़ंक्शन में पास करता है।

तो बुनियादी तौर पर, forEach यूज-केस के लिए एक आशुलिपि विधि है "एक function के लिए एक array के प्रत्येक तत्व पारित"।

// shortcut for document.querySelectorAll 
function $$(expr, con) { 
    return Array.prototype.slice.call((con || document).querySelectorAll(expr)); 
} 

// hide an element 
function hide(el) { 
    el.style.display = 'none'; 
} 

// hide all divs via forEach 
$$('div').forEach(hide); 

// hide all divs via for 
for (var divs = $$('div'), i = 0; i < divs.length; i++) { 
    hide(divs[i]) 
} 

आप देख सकते हैं, foreach बयान की पठनीयता एक for पाश की तुलना में सुधार हुआ है: मैं जहां लगता है Array.forEach एक for पाश की तुलना में काफी उपयोगी है, यहां एक सामान्य उदाहरण है।

दूसरी तरफ, for कथन अधिक लचीला है: इसमें जरूरी नहीं है कि इसमें कोई सरणी शामिल हो। सामान्य for लूप का प्रदर्शन थोड़ा बेहतर है, क्योंकि इसमें शामिल प्रत्येक तत्व के लिए कोई फ़ंक्शन कॉल नहीं है। इसके बावजूद, for लूप से बचने की अनुशंसा की जाती है जब इसे forEach कथन के रूप में लिखा जा सकता है।

+0

आपने निश्चित रूप से स्वीकार्य के पक्ष में एक महान बिंदु बनाया है। – sachinjain024

+1

लेकिन अंतर कहां है? आपने केवल – Vigneshwaran

+0

@ सिल्वर बुलेट के लिए जानकारी दी है, धन्यवाद, मैंने 'उत्तर' के लिए अधिक जानकारी प्रदान करने और अंतर को स्पष्ट करने के लिए अपना उत्तर संशोधित किया। – terabaud

9

forEach लूप में आप सरणी पर पुन: प्रयास करने के तरीके को नियंत्रित नहीं करते हैं। क्लासिक for लूप आपको इच्छित एल्गोरिदम चुनने की अनुमति देता है (i++; i--; i+=2*i, आदि)।

हालांकि, एक forEach पाश बहुत उपयोग करना आसान है - आप के लिए जे एस यह होता है - आप array[i] वस्तु खोजने, सभी i गिनती के साथ गड़बड़ की जरूरत नहीं है।

+0

अच्छा बिंदु के लिए धन्यवाद .. + 1। यह लूप के बारे में वास्तव में अच्छी बात है कि आप अपनी स्थिति के अनुसार लूप इंडेक्स में हेरफेर कर सकते हैं। उदाहरण के लिए: संख्याओं को प्रिंट करना भी। – sachinjain024

5
>> sparseArray = [1, 2, , 4]; 

>> sparseArray.forEach(console.log, console); 
1 0 [1, 2, 3: 4] 
2 1 [1, 2, 3: 4] 
4 3 [1, 2, 3: 4] 

>> for(var i = 0; i < sparseArray.length; ++i) { console.log(sparseArray[i]) }; 
1 
2 
undefined 
4 

forEach हाल ही में एक जावास्क्रिप्ट में अर्थपूर्ण सूची-समझ शैली संभव बनाने के लिए है। यहाँ आप देख सकते हैं कि forEachतत्वों कि सेट नहीं किया गया है, लेकिन सबसे अच्छा आप एक for पाश के साथ कर सकते undefined या null, जो दोनों के मूल्यों के रूप में स्थापित किया जा सकता है और forEach द्वारा उठाया के लिए जाँच करने के लिए है छोड़ देता है। जब तक आप गुम मूल्यों की अपेक्षा नहीं करते हैं, forEachfor लूप के बराबर है, लेकिन ध्यान दें कि आप जल्दी से नहीं रोक सकते हैं, जिसके लिए आपको every की आवश्यकता है।

+0

+1 @ फिल आप बहुत अच्छे बिंदु बनाते हैं। – sachinjain024

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