दिलचस्प पोस्ट
प्रतिक्रियाएक्सएक्सएमएल हमेशा शून्य अजगर: निष्पादन योग्य ज़िप फ़ाइलों में डेटा फ़ाइलों को शामिल किया जा सकता है? क्या आप यह पता लगा सकते हैं कि जिस ऑब्जेक्ट को आप deserialized किया था, वह जेएसएनएनटीटी में JsonConvert क्लास के साथ फ़ील्ड गुम था एक विंडोज़ प्रपत्र आवेदन पत्र में एक फ़ाइल एक्सप्लोरर उदाहरण को एम्बेड करना एक फाइल reparse करने के लिए Logstash मजबूर करने के लिए कैसे? आप जावा उप-वर्ग में किसी विधि की दृश्यता को कम क्यों नहीं कर सकते? Facebook पर साझा करने के दौरान विशेष छवि को थंबनेल के रूप में कैसे दिखाया जाए? वस्तु द्वारा पंडों समूह के समूह में पंक्तियों की संख्या कैसे गिनेंगी? Xcode 7 में ENABLE_BITCODE क्या करता है? PHP में फ़ाइल करने के लिए एक नई पंक्ति लेखन चहचहाना बूटस्ट्रैप ड्रॉपडाउन टॉगल लिंक पर क्लिक करने की अनुमति दें? कैसे कंटोइस एचजी का उपयोग कर भट्ठा / मर्क्यूरीयल में फ़ाइलों को अनदेखा करने के लिए "जो कि रिपॉजिटरी का हिस्सा हैं" सी # में एक अस्थायी और अपरिवर्तनीय स्ट्रिंग के बीच क्या अंतर है? कैसे संस्करण एक डेटाबेस में एक रिकॉर्ड को नियंत्रित करने के लिए लिंक पर लिंक किए गए पृष्ठ के एक छोटे से पॉपअप में लाइव पूर्वावलोकन कैसे दिखाएं?

Array.prototype.slice.call () कैसे काम करता है?

मुझे पता है कि तर्क को एक वास्तविक सरणी बनाने के लिए प्रयोग किया जाता है, लेकिन मुझे समझ में नहीं आता कि क्या होता है जब Array.prototype.slice.call(arguments)

वेब के समाधान से एकत्रित समाधान "Array.prototype.slice.call () कैसे काम करता है?"

हुड के नीचे क्या होता है यह है कि जब .slice() को सामान्य रूप से कहा जाता है, this एक सरणी है, और फिर यह केवल उस अर्रे पर .slice() , और उसका काम करता है।

यह कैसे है? .slice() एक एरे का काम है? क्योंकि जब आप करते हैं:

 object.method(); 

object स्वचालित रूप से this method() का मूल्य method() हो जाता है method() । के साथ:

 [1,2,3].slice() 

[1,2,3] सरणी को इस के मूल्य के रूप में सेट किया जाता है। .slice()


लेकिन क्या होगा यदि आप this मूल्य के रूप में कुछ और विकल्प चुन सकते हैं? जब तक आपके विकल्प के स्थान पर कोई संख्यात्मक .length है, .length संपत्ति, और संख्यात्मक सूचकांक वाले गुणों का एक गुच्छा, यह काम करना चाहिए। इस प्रकार की ऑब्जेक्ट को अक्सर सरणी-जैसी ऑब्जेक्ट कहा जाता है।

.apply() .call() और .apply() तरीकों से आपको मैन्युअल रूप से फ़ंक्शन के this मूल्य को निर्धारित करने दें। इसलिए यदि हम इस के मूल्य को array-like ऑब्जेक्ट में .slice() , तो .slice() यह मान लेता है कि यह एक अर्रे के साथ काम कर रहा है, और इसकी बात करेगा।

एक उदाहरण के रूप में इस सादा वस्तु को लें।

 var my_object = { '0': 'zero', '1': 'one', '2': 'two', '3': 'three', '4': 'four', length: 5 }; 

यह स्पष्ट रूप से एक सरणी नहीं है, लेकिन यदि आप इसे .slice() के this मूल्य के रूप में सेट कर सकते हैं, तो यह सिर्फ काम करेगा, क्योंकि यह ठीक से काम करने के लिए।

 var sliced = Array.prototype.slice.call( my_object, 3 ); 

उदाहरण: http://jsfiddle.net/wSvkv/

जैसा कि आप कंसोल में देख सकते हैं, परिणाम हम उम्मीद करते हैं:

 ['three','four']; 

तो यह तब होता है जब आप .slice() के this मान के रूप में एक arguments वस्तु निर्धारित करते हैं। चूंकि arguments में एक। .length संपत्ति है और संख्यात्मक सूचकांक का एक गुच्छा, .slice() बस उसके काम के बारे में चला जाता है जैसे कि यह एक वास्तविक सरणी पर काम कर रहा था।

arguments ऑब्जेक्ट वास्तव में एक अर्रे का उदाहरण नहीं है, और इसमें कोई भी ऐरे विधि नहीं है। तो, arguments.slice(...) काम नहीं करेगा क्योंकि तर्क वस्तु में स्लाइस विधि नहीं है

सरणियों का यह तरीका है, और क्योंकि arguments ऑब्जेक्ट एक सरणी के समान है, दोनों संगत हैं। इसका अर्थ है कि हम तर्कों के साथ सरणी विधियों का प्रयोग कर सकते हैं। और जब से सरणी पद्धतियां एरे के साथ बनाई गई थीं, वे अन्य तर्क ऑब्जेक्ट्स की बजाय एरेज़ वापस कर देंगे।

तो Array.prototype उपयोग क्यों Array.prototype ? Array वस्तु है जो हम new Array() ) से बनाते हैं, और ये नए एरेज़ तरीके और गुणों को पार करते हैं, जैसे टुकड़ा। ये विधियां [Class].prototype ऑब्जेक्ट में संग्रहीत हैं। इसलिए, कुशलता के लिए, (new Array()).slice.call() द्वारा स्लाइस विधि तक पहुंचने के बजाय (new Array()).slice.call() या [].slice.call() , हम इसे सीधे प्रोटोटाइप से प्राप्त करते हैं। ऐसा इसलिए है कि हमें एक नया सरणी शुरू करने की आवश्यकता नहीं है।

लेकिन हमें यह पहली जगह में क्यों करना है? ठीक है, जैसा आपने कहा था, यह एक आर्गुमेंट ऑब्जेक्ट को एक अर्रे इंस्टेंस में परिवर्तित करता है। हम टुकड़ा का उपयोग क्यों करते हैं, हालांकि, किसी भी चीज़ की तुलना में "हैक" का अधिक है। टुकड़ा विधि ले जाएगा, आप इसे अनुमान लगाया है, एक सरणी का टुकड़ा और एक नया सरणी के रूप में उस टुकड़ा वापस। इसे करने के लिए कोई तर्क नहीं (इसके संदर्भ के रूप में तर्क वस्तु के अलावा) से पारित "सरणी" (इस मामले में, तर्क ऑब्जेक्ट) का पूरा हिस्सा लेने के लिए स्लाइस विधि का कारण बनता है और इसे एक नए सरणी के रूप में लौटाता है

आम तौर पर, कॉलिंग

 var b = a.slice(); 

सर में a को b में कॉपी करेगा। हालांकि, हम ऐसा नहीं कर सकते

 var a = arguments.slice(); 

क्योंकि arguments एक वास्तविक सरणी नहीं है, और एक विधि के रूप में slice नहीं है Array.prototype.slice सरणियों के लिए slice फ़ंक्शन है, और call this सेट के साथ arguments को Array.prototype.slice है।

 // We can apply `slice` from `Array.prototype`: Array.prototype.slice.call([]); //-> [] // Since `slice` is available on an array's prototype chain, 'slice' in []; //-> true [].slice === Array.prototype.slice; //-> true // … we can just invoke it directly: [].slice(); //-> [] // `arguments` has no `slice` method 'slice' in arguments; //-> false // … but we can apply it the same way: Array.prototype.slice.call(arguments); //-> […] // In fact, though `slice` belongs to `Array.prototype`, // it can operate on any array-like object: Array.prototype.slice.call({0: 1, length: 1}); //-> [1] 

सबसे पहले, आपको यह पढ़ना चाहिए कि कैसे फ़ंक्शन अभिविन्यास जावास्क्रिप्ट में काम करता है मुझे संदेह है कि अकेले आपके प्रश्न का उत्तर देने के लिए पर्याप्त है। लेकिन यहाँ क्या हो रहा है इसका सारांश है:

Array.prototype.slice प्रोटोटाइप से slice विधि को निकालती है। लेकिन इसे सीधे कॉल करने से काम नहीं करेगा, क्योंकि यह एक विधि है (फ़ंक्शन नहीं) और इसलिए एक संदर्भ (एक कॉलिंग ऑब्जेक्ट, this ) की आवश्यकता है, अन्यथा यह Uncaught TypeError: Array.prototype.slice called on null or undefined को फेंक देगा Uncaught TypeError: Array.prototype.slice called on null or undefined

call() विधि आपको एक विधि का संदर्भ निर्दिष्ट करने की अनुमति देती है, मूल रूप से ये दो कॉल समकक्ष बनाते हैं:

 someObject.slice(1, 2); slice.call(someObject, 1, 2); 

पूर्व को छोड़कर कुछ someObject के प्रोटोटाइप श्रृंखला (जैसा कि यह Array लिए होता है) में मौजूद slice विधि की आवश्यकता होती है, जबकि बाद में संदर्भ (कुछ someObject ) को विधि को मैन्युअल रूप से पारित करने के लिए अनुमति देता है।

इसके अलावा, बाद के लिए कम है:

 var slice = Array.prototype.slice; slice.call(someObject, 1, 2); 

जो समान है:

 Array.prototype.slice.call(someObject, 1, 2); 

इसके कारण, एमडीएन नोट्स के रूप में

तर्क ऑब्जेक्ट एक सरणी नहीं है यह एक सरणी के समान है, लेकिन लंबाई के अलावा कोई सरणी गुण नहीं है उदाहरण के लिए, इसमें पॉप पद्धति नहीं है। हालांकि इसे किसी वास्तविक सरणी में बदला जा सकता है:

यहाँ हम देशी ऑब्जेक्ट Array पर slice कॉल कर रहे हैं और इसके क्रियान्वयन पर नहीं और वह भी क्यों अतिरिक्त .prototype

 var args = Array.prototype.slice.call(arguments); 

मत भूलो, कि इस व्यवहार की निम्न-स्तरीय मूल बातें टाइप-कास्टिंग है जो जेएस-इंजन में पूरी तरह से एकीकृत है।

स्लाइस सिर्फ ऑब्जेक्ट लेता है (मौजूदा आर्ग्यूमेंट्स के लिए लम्बाई संपत्ति) और उस पर सभी कार्यों को करने के बाद सरणी-ऑब्जेक्ट काट दिया।

यदि आप INT- मान के साथ स्ट्रिंग-विधि का इलाज करने का प्रयास करते हैं तो आप उसी तर्कशास्त्र का परीक्षण कर सकते हैं:

 String.prototype.bold.call(11); // returns "<b>11</b>" 

और वह ऊपर दिए गए बयान को बताते हैं

Array.prototype.slice.call (आर्ग्यूमेंट्स) एक सरणी में एक तर्क को रूपांतरित करने का पुराना तरीका है।

ECMAScript 2015 में, आप Array.from या प्रसार ऑपरेटर का उपयोग कर सकते हैं:

 let args = Array.from(arguments); let args = [...arguments]; 

यह slice पद्धति एरेज़ का उपयोग करता है और इसे अपने arguments ऑब्जेक्ट के साथ कहता है। इसका मतलब यह है कि यह आपको ऐसा कहता है जैसे कि आपने arguments.slice() arguments को संभालने में ऐसी कोई विधि थी

बिना किसी तर्क के एक टुकड़ा बनाना, बस सभी तत्वों को ले जाएगा – इसलिए यह केवल तत्वों से एक सरणी में प्रतियां कॉपी करता है।

मान लें कि आपके पास है: function.apply(thisArg, argArray )

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

टुकड़ा () विधि एक सरणी का एक हिस्सा चुनता है, और नए सरणी को लौटाता है

इसलिए जब आप Array.prototype.slice.apply(arguments, [0]) कहते हैं। Array.prototype.slice.apply(arguments, [0]) अरै स्लाइस विधि को तर्कों पर लागू किया जाता है (बाइंड)

थोड़ी देर हो सकती है, लेकिन यह सब गड़बड़ का जवाब है कि कॉल () को विरासत के लिए जेएस में इस्तेमाल किया जाता है। यदि हम इसकी तुलना पायथन या PHP के लिए करते हैं, उदाहरण के लिए, कॉल क्रमशः सुपर () के रूप में उपयोग किया जाता है। init () या पैरेंट :: _ कंस्ट्रक्ट ()

यह उसके उपयोग का एक उदाहरण है जो सभी को स्पष्ट करता है:

 function Teacher(first, last, age, gender, interests, subject) { Person.call(this, first, last, age, gender, interests); this.subject = subject; } 

संदर्भ: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance

जब .slice () सामान्य रूप से कहा जाता है, यह एक सरणी है, और फिर यह केवल उस अर्रे पर घुमाता है, और उसका काम करता है

  //ARGUMENTS function func(){ console.log(arguments);//[1, 2, 3, 4] //var arrArguments = arguments.slice();//Uncaught TypeError: undefined is not a function var arrArguments = [].slice.call(arguments);//cp array with explicity THIS arrArguments.push('new'); console.log(arrArguments) } func(1,2,3,4)//[1, 2, 3, 4, "new"] 

मैं खुद को याद दिलाने के लिए यह लिख रहा हूं …

  Array.prototype.slice.call(arguments); == Array.prototype.slice(arguments[1], arguments[2], arguments[3], ...) == [ arguments[1], arguments[2], arguments[3], ... ] 

या सिर्फ एक चीज को सरणी में बदलने के लिए यह आसान फ़ंक्शन $ A का उपयोग करें।

 function hasArrayNature(a) { return !!a && (typeof a == "object" || typeof a == "function") && "length" in a && !("setInterval" in a) && (Object.prototype.toString.call(a) === "[object Array]" || "callee" in a || "item" in a); } function $A(b) { if (!hasArrayNature(b)) return [ b ]; if (b.item) { var a = b.length, c = new Array(a); while (a--) c[a] = b[a]; return c; } return Array.prototype.slice.call(b); } 

उदाहरण के उपयोग …

 function test() { $A( arguments ).forEach( function(arg) { console.log("Argument: " + arg); }); }