2016-03-09 6 views
5

में लूप के लिए _.foreach() या बेहतर देशी का उपयोग करना चाहिए, मैंने अभी टाइपस्क्रिप्ट के साथ काम कर रहे एक नए प्रोजेक्ट में काम करना शुरू कर दिया है। मैं एक और परियोजना से आ रहा हूं जो टाइपस्क्रिप्ट के साथ भी काम करता है। चूंकि टाइपस्क्रिप्ट में लूप के मूल निवासी हैं, इसलिए हमने इसका उपयोग करने के लिए (पुरानी परियोजना टीम) का निर्णय लिया है। मेरे लिए Espacialy मेरे जावा पृष्ठभूमि से संबंधित, लूप के लिए लिखना ज्यादा सुविधाजनक था।क्या हमें टाइपस्क्रिप्ट

अब नई परियोजना में वे हर जगह _.foreach() पाश का उपयोग सरणी पर फिर से करने के लिए करते हैं।

क्या मैं सोच रहा हूँ, वहाँ एक प्रदर्शन और के लिए देशी टाइपप्रति के बीच का अंतर _.foreach()

मैं jsperf में एक छोटे से परीक्षण वे कम या ज्यादा ठीक उसी गति होने के लिए सीवन बना लिया है ...

https://jsperf.com/foreach-vs-forof/12

की

for (let num: string of list){ 
    console.log(num); 
} 

लिए टाइपप्रति जावास्क्रिप्ट

012 में
var list = "9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9".split(); 

//Transpiled TypeScript for of  | **19,937 ±5.04% 
for (var _i = 0, list_1 = list; _i < list_1.length; _i++) { 
    var num = list_1[_i]; 
    console.log("" + num); 
} 

//lodash       | 20,520 ±1.22% 
_.forEach(list, function(item) { 
    console.log("" + item) 
}); 

इम्हो मैं टाइपस्क्रिप्ट से "मूल" पसंद करूंगा क्योंकि यह मेरे लिए अधिक पठनीय है।

आप लोग क्या उपयोग करने का सुझाव देते हैं? क्या अन्य अंक हैं या बेहतर _.forEach

उत्तर

2

मैं लॉनाश पर टिप्पणी नहीं कर सकता, मैंने इसका उपयोग नहीं किया है। लेकिन नीचे कुछ पृष्ठभूमि है जो मदद कर सकती है।

'फॉर ऑफ' टाइपस्क्रिप्ट 1.5 में प्रत्येक तत्व के चारों ओर लूपिंग के लिए पेश किया गया था। एक सरणी सूची। यदि आप जेएस आउटपुट की जांच करते हैं (और यदि आप ईसीएमए स्क्रिप्ट 5 या 6 को लक्षित कर रहे हैं, तो आपको यह पता होना चाहिए कि ईसीएमएएस क्रिप्ट 5 के मामले में नीचे दिए गए दोनों का आउटपुट समान होगा। See this article for associated background reading और ईएस 6/2015 को लक्ष्यीकरण आउटपुट को कैसे प्रभावित करेगा।

फॉरएच के टाइपस्क्रिप्ट कार्यान्वयन के लिए, इस पर गिटहब here पर एक दिलचस्प चर्चा है। विशेष रूप से लूप से सशर्त ब्रेक के आसपास।

for (let line of v.lineEntry) { 

} 

for (var _i = 0, list_1 = list; _i < list_1.length; _i++) { 

} 
2

अपने परीक्षण के आधार पर मैं देशी Array.prototype.forEach का उपयोग कर एक और जोड़ा,:

list.forEach(function(item) { 
    console.log("" + item) 
}); 

यह मेरा पसंदीदा तरीका वास्तव में, क्योंकि यह वास्तव में बहुत टाइप करने के लिए आसान है। इसके अलावा अन्य चीजों के करीब जो आप सरणी के साथ करना चाहते हैं उदा। map/filter आदि

ध्यान दें कि http://jsperf.com/foreach-vs-forof/9 सभी तीनों में कोई व्यावहारिक प्रदर्शन अंतर नहीं है।

2

मुझे मेरे पढ़ने से परे टाइपस्क्रिप्ट के साथ कोई अनुभव नहीं है लेकिन मेरे पास ES6/ES2015 के साथ काफी अनुभव है। for of ES2015 spec का हिस्सा था और अभी भी अंतिम रूप दिया गया था। मैं एमडीएन से for of पर this लेख पढ़ूंगा।

यहाँ कुछ समानताएं और for of और forEach के मतभेद हैं (और इन बस के रूप में जहाँ तक मैं पाया है कर रहे हैं और वर्तमान में के बारे में पता):

  • forEach lodash में संग्रह है कि सरणी, वस्तुओं रहे हैं पर काम करता है, या स्ट्रिंग्स। सरणी, मानचित्र और सेट पर

  • देशी forEach काम करता है।

  • for of सभी Iterables पर काम करता है: सरणी, तार, TypedArrays, मैप्स, सेट, डोम संग्रह, और जनरेटर।

मैं Exploring ES6 से for of पर इस अध्याय में लिखा होगा (तलाश ES6 एक महान पढ़ा है। यह बहुत ही गहन है। यह नि: शुल्क ऑनलाइन के रूप में अच्छी तरह से।) के रूप में विभिन्न बारे में for of कि नहीं कर रहे यह से कुछ चीजें हैं जो मेरे लिए बाहर खड़े forEach में टी नहीं है।

को तोड़ने और अंदर काम जारी रखने के लिए-के छोरों

break और continueforEach में उजागर नहीं कर रहे हैं। निकटतम बात आप foreach में continue को प्राप्त कर सकते हैं return उपयोग कर रहा है जो वास्तव में काफी एक ही बात है। break के रूप में हालांकि मैं कोई विकल्प नहीं देखते हैं (लेकिन lodash छूट नहीं है, क्योंकि ज्यादातर चीजें हैं जो खोजने और एक आइटम लौटने की तरह टूट जाता है की जरूरत पहले से ही lodash के पुस्तकालय के बहुत से कवर कर रहे हैं)।

यदि Object.entries ES2017 में आता है तो प्रस्तावित किया गया है कि आप वस्तुओं को आसानी से और सटीकता के साथ अपने समृद्ध गुणों और मूल्यों को फिर से सक्रिय कर सकते हैं। यदि आप अब इसका उपयोग करना चाहते हैं तो आप पॉलीफिल here में से एक के साथ कर सकते हैं। यहां एक उदाहरण दिया गया है जो ऐसा दिखाई देगा।

var obj = {foo: "bar", baz: "qux"}; 

for (let x of Object.entries(obj)) { // OK 
    console.log(x); // ["foo", "bar"], ["baz", "qux"] 
} 

और here मैंने लिखा एक त्वरित पॉलीफिल के साथ एक कार्यान्वयन। आप आम तौर पर सरणी विनाशकारी का उपयोग करेंगे जो कि कुंजी और मूल्य को अपने स्वयं के चरों में अलग करेगा।

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

forEach और बीच

for of तुम सिर्फ तय करने के लिए (उदाहरण के लिए, समूह या जेनरेटर for of का उपयोग आप break रों की जरूरत है या नक्शे का उपयोग करने की आवश्यकता है) जो एक मौजूदा नौकरी के लिए सबसे अच्छा है की जरूरत है। इसके अलावा मुझे लगता है कि संग्रह पर या तो दोनों अपने मुख्य कार्यशीलताओं के साथ काम करने के लिए विशेष रूप से मजबूत कारण नहीं हैं। इसके अलावा उपयोग कर सकते हैं कि जब संग्रह के साथ काम कर या तो forEach या for of यह मुख्य रूप से सिर्फ व्यक्तिगत वरीयता अप करने के लिए वे लगभग उसी गति पर वही चीज़ करते हैं (और गति दुभाषिया के अनुसार किसी भी समय बदल सकता है)।मुझे लगता है कि लॉनाश के विशेष फायदे इसके अन्य विभिन्न कार्यों के लिए हैं जो वास्तव में आपको कोड लिखने, कम करने, फ़िल्टर करने और खोजने जैसे कोड लिखने में बहुत समय बचा सकता है। चूंकि आप for of लिखने में सबसे सहज महसूस करते हैं, मेरा सुझाव है कि आप इसे इस तरह लिखना जारी रखें लेकिन एक बार जब आप अपने अन्य कार्यों का उपयोग करके लॉनाश में लिखना शुरू कर देते हैं तो आप इसे लॉनाश तरीके से लिखने में अधिक सहज महसूस कर सकते हैं।

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

अपने कोड पर देख रहे हैं मैं अपनी सूची निर्माण के साथ एक त्रुटि देखा। अंत में आपके पास .split() था और आपको .split(",") होना चाहिए था। आप पूरी स्ट्रिंग की लंबाई 1 की सूची बना रहे थे और उस स्ट्रिंग पर एक बार फिर से चल रहे थे, यही कारण है कि बेंच के निशान इतने समान थे। मैं परीक्षणों को फिर से चलाता हूं। Here वे हैं। मैं अभी भी उस प्रदर्शन के बारे में चिंता नहीं करता जो हर बार चलने पर लगता है।