कैसे "तर्क" से एक टुकड़ा पाने के लिए


80

आप सभी जानते हैं कि argumentsएक विशेष वस्तु है जो फ़ंक्शन में दिए गए सभी तर्कों को रखती है।

और जब तक यह एक सरणी नहीं है - आप कुछ का उपयोग नहीं कर सकते arguments.slice(1)।

तो सवाल - कैसे सब कुछ टुकड़ा करने के लिए लेकिन पहले तत्व से arguments?

UPD :

ऐसा लगता है कि इसे किसी सरणी में बदलने के बिना कोई रास्ता नहीं है

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

यदि कोई अन्य समाधान पोस्ट करता है तो यह बहुत अच्छा होगा, यदि नहीं - मैं पहले एक को उत्तर के रूप में ऊपर की रेखा के साथ जांच करूंगा।


+ झटके वहाँ वास्तव में एक argumentsसरणी के लिए इसे लेने और परिवर्तित करने से बेहतर तरीका है आदि कृपया नीचे मेरा जवाब देखें।
— उमुर करागोज

जवाबों:


20

सरणी फ़ंक्शन के साथ मेडलिंग वास्तव में आवश्यक नहीं है।

बाकी पैरामीटर सिंटैक्स ...rest का उपयोग करना क्लीनर और अधिक सुविधाजनक है।

उदाहरण

function argumentTest(first, ...rest) {
  console.log("First arg:" + first);

  // loop through the rest of the parameters
  for (let arg of rest) {
    console.log("- " + arg);
  }
}

// call your function with any number of arguments
argumentTest("first arg", "#2", "more arguments", "this is not an argument but a contradiction");

...आराम


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

2
अब एक और साल के बाद मुझे लगता है कि नए ES मानकों पर स्विच करने का समय आ गया है :-)
— zerkms

जब आप एक साल पुराने उत्तर के लिए +15 अंक प्राप्त करते हैं तो यह महसूस होता है :-D
— zerkms

133

Q. कैसे सब कुछ टुकड़ा करने के लिए लेकिन पहले तत्व से arguments?

निम्नलिखित पहले को छोड़कर सभी तर्कों वाले एक सरणी को लौटाएगा:

var slicedArgs = Array.prototype.slice.call(arguments, 1);

आपको argumentsपहले एक सरणी में परिवर्तित करने की आवश्यकता नहीं है , यह सब एक चरण में करें।


मेरा मानना ​​है कि इसके साथ एक नकारात्मक पहलू है। यदि केवल एक अतिरिक्त तर्क है (पहले एक के अलावा) कुछ भी नहीं लौटाया जाता है।
— ट्रेवर

@ ट्रेवर - नहीं, यह एक एरे को एक तत्व के साथ लौटाता है जो दूसरा तर्क है। (यह कुछ भी क्यों नहीं लौटाएगा?)
— nnnnnn

4
यहाँ अनुशंसा बताती है कि आपको तर्कों पर स्लाइस का उपयोग नहीं करना चाहिए क्योंकि यह जावास्क्रिप्ट इंजन अनुकूलन को रोकता है।
— जोनाथन लिन

1
अधिक विवरण में यहां
— डेविड चेस

4
@ दाऊद - "विस्तार से" लिंक अभी भी उपयोग करने के लिए नहीं कहते हैं .slice()पर arguments, लेकिन केवल कारण नहीं दिया गया है कि यह समारोह के जे एस इंजन अनुकूलन को रोकता है। तो ऐसा नहीं है कि यह विफल रहता है, यह सिर्फ धीमा हो सकता है। मैं दिन के जेएस इंजन में अनुकूलन को पूरा करने के लिए कोड लिखने नहीं जा रहा हूं, न कि जब कल का इंजन अनुकूलन समस्या को हल कर सकता है, और किसी भी स्थिति में अंतर संभवतः उपयोगकर्ता के लिए सबसे अधिक स्वीकार्य नहीं होगा। मामलों। स्पष्ट और आसानी से बनाए रखने वाले कोड को लिखने के लिए पहले बेहतर है, फिर वापस आएं और केवल तभी अनुकूलन करें जब एक औसत दर्जे का प्रदर्शन मुद्दा उठता है।
— nnnnnn

11

आप "स्लाइसिंग विदाउट स्लाइसिंग" कर सकते हैं।

function fun() {
  var args = [];

  for (var i = 1; i < arguments.length; i++) {
    args.push(arguments[i]);
  }

  return args;
}

fun(1, 2, 3, 4, 5); //=> [2, 3, 4, 5]

2
हाँ, यह काम करता है, लेकिन इस मामले में कोई मतलब नहीं है कि हम एक है .slice();-)
— zerkms

बेशक यह उपयोग करने में आसान है Array.prototype.slice, लेकिन आपका सवाल था कि क्या कोई और तरीका था।
— पॉल रोजानिया

हाँ, उस के लिए धन्यवाद ;-) (हालांकि स्पष्ट रूप से मुझे इसके बारे में पता है for:-P)
— zerkms

हाहा, मुझे आशा है कि मैंने ट्राइट को ध्वनि नहीं दी थी। कभी-कभी यह एसओ पर उपयोगी जानकारी है!
— पॉल रोसानिया

3
+1 यह V8 के लिए एकमात्र सही समाधान प्रतीत होता है। यहाँ अनुकूलन बेंचमार्किंग पर एक नज़र डालें: jsperf.com/leaky-args
— Tom Auger

11

से https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments :

आपको तर्कों पर कटाक्ष नहीं करना चाहिए क्योंकि यह जावास्क्रिप्ट इंजन (उदाहरण के लिए V8) में अनुकूलन को रोकता है। इसके बजाय, तर्कों ऑब्जेक्ट के माध्यम से पुनरावृति करके एक नई सरणी बनाने का प्रयास करें।

तो ऊपर पॉल रोजियाना का जवाब सही है


4
संभावित हो। लेकिन मैं यह नहीं देखता कि अनुकूलन इंजन स्वीकृत उत्तर के वन-लाइनर का इलाज कैसे कर सकता है और किसी भी तरह से वे अपनी इच्छा से इसे अनुकूलित कर सकते हैं। यदि हम ऑप्टिमाइज़र (दिन के लिए) कोड करना शुरू करते हैं तो यह लंबे समय में एक उपद्रव है - व्यक्तिगत रूप से मैं कोड की स्पष्टता पसंद करता हूं।
— एकुप्पी

2
'स्लाइस' में परिवर्तन नहीं होता है। यह मूल सरणी से तत्वों की उथली प्रतिलिपि देता है। मूल सरणी के तत्वों को वापस लौटे सरणी में कॉपी किया जाता है। इसलिए मैं यह नहीं समझ सकता कि मैन्युअल कॉपी से लेकर नए एरे और स्लाइस में क्या अंतर है।
— मैक्सिम

2018 तक, चेतावनी अब नहीं है। हमें सुरक्षित होना चाहिए, मुझे लगता है।
— GBF_Gabriel

9

यह एक तरीका हो सकता है:

var args = Array.from(arguments).slice(1);

इन दिनों यह बिल्कुल भी आवश्यक नहीं है:function foo(...args)
— zxms

@zerkms मैं प्रदर्शन कारणों से आपके सुझाव को खारिज करने वाला था, लेकिन मेरा परीक्षण बाकी मापदंडों को सबसे तेज़ समाधान के रूप में दिखा रहा है! gist.github.com/18d590d12aef1e90d2ed262f4fab0c96
— कोडी एलन टेलर

@CodyAllanTaylor कार्यान्वयन में सुधार। जब तक आप नहीं करने के लिए एक बहुत-सच-सच महत्वपूर्ण कारण है, मैं अधिक पठनीय वाक्य रचना पर कायम हैं
— zerkms

0

आप विधि का उपयोग कर सकते हैं [].slice.call(arguments, 1)

[] .slice आप टुकड़ा समारोह वस्तु वापस आ जाएगी और आप के रूप में यह कॉल कर सकते हैं argumentsऔर 1मापदंड हैं


आपके द्वारा पोस्ट करने से पहले पोस्ट किए गए उत्तरों के माध्यम से आपके द्वारा चेक किया गया कोई परिवर्तन? समान (और यहां तक ​​कि थोड़ा बेहतर है, क्योंकि यह एक फेंक-दूर सरणी आवंटित नहीं करता है) उत्तर पहले से ही पोस्ट किया गया है और जांचा जाता है।
— zerkms

0

आप उपयोग कर सकते हैं ... पहले और बाकी के तर्कों को अलग करने के लिए फ़ंक्शन के भीतर आराम करें:

function foo(arr) {
  const [first, ...rest] = arguments;
  console.log(`first = ${first}`);
  console.log(`rest = ${rest}`);
}
//Then calling the function with 3 arguments:
foo(1,2,3)


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