2016-01-01 5 views
17

निम्न नमूना कोडफैले सिंटेक्स ES6

var x = ["a", "b", "c"]; 
var z = ["p", "q"]; 

var d = [...x, ...z]; 

var e = x.concat(z); 

यहाँ, d और e का मूल्य बिल्कुल एक जैसे हैं पर विचार करें और ["a", "b", "c", "p", "q"] के बराबर है, इसलिए,

  1. वास्तव में क्या इन के बीच अंतर है दो?
  2. कौन सा अधिक कुशल है और क्यों?
  3. फैलाव वाक्यविन्यास का उपयोग वास्तव में क्या है?

क्या आपको नहीं लगता कि औपचारिक विशाल भाषा में इन छोटे शॉर्टकटों का परिचय कुछ अनजान बग छोड़ सकता है, मेरा मतलब है कि यह बहुत अनावश्यक है या मुझे इसकी आवश्यकता नहीं है।

+0

जबकि इसके उत्तर: "क्या आपको नहीं लगता कि औपचारिक विशाल भाषा में इन छोटे शॉर्टकटों का परिचय कुछ अनजान बग छोड़ सकता है" राय होगी, मेरी राय यह है कि, हाँ, अधिकांश ईएस 6 है बग्गी कोड का एक बड़ा हिस्सा उत्पन्न करने जा रहा है क्योंकि मैला और/या जूनियर डेवलपर्स वास्तव में समझ नहीं पाएंगे कि वे क्या कर रहे हैं। – rockerest

+0

तेजी से करने का समय! – towerofnix

+0

@ रॉकस्टेस्ट ठीक वही है जो मैं सोच रहा था। – void

उत्तर

11
  1. अपने उदाहरण दिया, वहाँ अनिवार्य रूप से दो
  2. .concat बीच कोई अंतर नहीं है, क्योंकि significantly more efficient: http://jsperf.com/spread-into-array-vs-concat... (प्रसार) अधिक मौलिक अंतर्निहित वाक्य रचना के शीर्ष कि स्पष्ट रूप से अनुक्रमित से अधिक दोहराता सरणी का विस्तार करने पर केवल वाक्यविन्यास चीनी है ।
  3. फैले sugared अधिक भद्दा प्रत्यक्ष सरणी हेरफेर की चोटी पर वाक्य रचना

ऊपर # 3 पर विस्तार करने के लिए अनुमति देता है, प्रसार के आपके उपयोग कुछ हद तक एक काल्पनिक उदाहरण है (एक संभावना है कि अक्सर जंगली में दिखाई देगा यद्यपि)। स्प्रेड उपयोगी होता है - उदाहरण के लिए - एक तर्क सूची की संपूर्णता फ़ंक्शन बॉडी में .call पर पारित की जानी चाहिए।

function myFunc(){ 
    otherFunc.call(myObj, ...args); 
} 

बनाम

function myFunc(){ 
    otherFunc.call(myObj, args[0], args[1], args[2], args[3], args[4]); 
} 

यह एक और मनमाने ढंग से उदाहरण है, लेकिन यह एक छोटे स्पष्ट क्यों फैल ऑपरेटर कुछ अन्यथा वर्बोज़ और भद्दा स्थितियों में उपयोग करने के लिए अच्छा होगा।

@loganfsmyth रूप points out:

फैले भी मनमाने ढंग से iterable वस्तुओं पर काम करता है मतलब है कि यह न केवल Array रों पर काम करता है, लेकिन यह भी Map और दूसरों के बीच Set जो।

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


इस विशेष संदर्भ में फैल ऑपरेटर के लिए वास्तविक अंतर्निहित वाक्य रचना के लिए (... के बाद से भी हो सकता है एक "आराम" पैरामीटर), the specification देखते हैं। "अधिक मौलिक अंतर्निहित वाक्यविन्यास जो सरणी को विस्तारित करने के लिए इंडेक्स पर स्पष्ट रूप से पुनरावृत्त करता है" जैसा कि मैंने उपरोक्त लिखा है, वह बिंदु प्राप्त करने के लिए पर्याप्त है, लेकिन वास्तविक परिभाषा GetValue और GetIterator का उपयोग करने वाले चर के लिए उपयोग करती है।

+0

उपयोग करने के लिए वास्तविक नमूना: '$ .when' जो पैरामीटर के रूप में वादे की सरणी की अनुमति नहीं देता है, इसलिए' $ .when (... args) 'शांत है :) – Grundy

+2

फैल भी मनमाने ढंग से पुनरावृत्त वस्तुओं पर काम करता है जिसका अर्थ है कि यह न केवल काम करता है 'ऐरे' पर भी 'मैप' और 'सेट' दूसरों के बीच। – loganfsmyth

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