क्या किसी फ़ंक्शन के सभी तर्कों को उस फ़ंक्शन के अंदर एकल ऑब्जेक्ट के रूप में प्राप्त करना संभव है?


जवाबों:


346

का उपयोग करें arguments। आप इसे एक ऐरे की तरह एक्सेस कर सकते हैं। arguments.lengthतर्कों की संख्या के लिए उपयोग करें ।


46
यह केवल पारंपरिक जावास्क्रिप्ट के लिए काम करता है function, न कि ES2015 + वसा तीर =>फ़ंक्शन। उन लोगों के लिए, आप ...argsफ़ंक्शन परिभाषा में उपयोग करना चाहते हैं जैसे (...args) => console.log(args):।
सवायातो जूल

141

तर्क है एक सरणी जैसी वस्तु (नहीं एक वास्तविक सरणी)। उदाहरण समारोह ...

function testArguments () // <-- notice no arguments specified
{
    console.log(arguments); // outputs the arguments to the console
    var htmlOutput = "";
    for (var i=0; i < arguments.length; i++) {
        htmlOutput += '<li>' + arguments[i] + '</li>';
    }
    document.write('<ul>' + htmlOutput + '</ul>');
}

कोशिश करके देखो...

testArguments("This", "is", "a", "test");  // outputs ["This","is","a","test"]
testArguments(1,2,3,4,5,6,7,8,9);          // outputs [1,2,3,4,5,6,7,8,9]

पूरा विवरण: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments


3
यहां भी रिजल्ट पोस्ट क्यों नहीं? :)
जोनाथन Azulay

2
यह स्वीकृत उत्तर की तुलना में बहुत बेहतर है क्योंकि इसमें एक कार्य कोड स्निपेट होता है और आउटपुट दिखाता है। स्वीकृत उत्तर भी विरल है।
मैक

अच्छा जवाब ... "नहीं एक वास्तविक सरणी" पर विस्तार के साथ एक महान जवाब होगा
terpinmd

मैंने एक सरल विवरण के लिए एक लिंक जोड़ा: "एरे-लाइक ऑब्जेक्ट" सिर्फ एक "ऑब्जेक्ट है जिसमें एक गैर-नकारात्मक इंटेगर की लंबाई संपत्ति है, और आमतौर पर कुछ अनुक्रमित गुण हैं।" मोज़िला लिंक से: "यह एक ऐरे के समान है, लेकिन इसमें लंबाई के अलावा कोई ऐरे गुण नहीं है।"
ल्यूक

31

ES6 एक निर्माण की अनुमति देता है जहां एक फ़ंक्शन तर्क को "..." संकेतन के साथ निर्दिष्ट किया जाता है

function testArgs (...args) {
 // Where you can test picking the first element
 console.log(args[0]); 
}

3
यह तीर फ़ंक्शन का उपयोग करते समय एकमात्र तरीका लगता है। a = () => {console.log(arguments);}; a('foo');देता है -- Uncaught ReferenceError: arguments is not defined लेकिन a = (...args) => {console.log(args);}; a('foo');देता है["foo"]
डेविड Baucum

1
@DavidBaucum जो सही है। क्योंकि तीर फ़ंक्शन नया स्कोप नहीं बनाता है, और स्कोप से "तर्क" एकत्र किए जाते हैं। लेकिन सबसे खराब स्थिति परिदृश्य संदर्भ नहीं है। यह है कि "तर्कों" को एक बाहरी दायरे से एकत्र किया जाता है। तब आपको कोई अपवाद नहीं मिलता है, और शायद आपके आवेदन में अजीब कीड़े।
pgsandstrom

1
इसे "बाकी पैरामीटर" भी कहा जाता है, डेवलपर . mozilla.org/en-US/docs/Web/JavaScript/Reference/… देखें ।
डेनिस

21

argumentsवस्तु जहां कार्यों तर्क जमा हो जाती है है।

तर्क ऑब्जेक्ट कार्य करता है और एक सरणी की तरह दिखता है, यह मूल रूप से है, इसमें सिर्फ वे तरीके नहीं हैं जो सरणियाँ करते हैं, उदाहरण के लिए:

Array.forEach(callback[, thisArg]);

Array.map(callback[, thisArg])

Array.filter(callback[, thisArg]);

Array.slice(begin[, end])

Array.indexOf(searchElement[, fromIndex])

मुझे लगता है कि किसी argumentsवस्तु को वास्तविक एरे में परिवर्तित करने का सबसे अच्छा तरीका ऐसा है:

argumentsArray = [].slice.apply(arguments);

यह एक सरणी बना देगा;

पुन: प्रयोज्य:

function ArgumentsToArray(args) {
    return [].slice.apply(args);
}

(function() {
   args = ArgumentsToArray(arguments);

   args.forEach(function(value) {
      console.log('value ===', value);
   });

})('name', 1, {}, 'two', 3)

परिणाम:

> value === name
> value === 1
> value === Object {}
> value === two
>value === 3


1
[].slice.apply(arguments);खिचड़ी भाषा सबसे अच्छा तरीका है क्योंकि यह एक अनावश्यक खाली सरणी आवंटन का कारण बनता है।
थॉमस ईडिंग

10

आप चाहें तो इसे एक ऐरे में भी बदल सकते हैं। यदि एरे जेनरिक उपलब्ध हैं:

var args = Array.slice(arguments)

अन्यथा:

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

से मोज़िला MDN :

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


2
अद्यतन के लिए धन्यवाद। एक विकल्प के रूप में JSON.stringify और JSON.parse का उपयोग करें: function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); } यदि स्ट्रिंग के बजाय संरक्षण की आवश्यकता है, तो आंतरिक संरचित क्लोनिंग एल्गोरिथ्म का उपयोग करें । यदि DOM नोड्स पास हैं, तो XMLSerializer का उपयोग किसी असंबंधित प्रश्न के रूप में करें । with (new XMLSerializer()) {serializeToString(document.documentElement) }
पॉल स्वेट

7

जैसा कि कई अन्य ने बताया, arguments किसी फ़ंक्शन के लिए दिए गए सभी तर्क शामिल हैं।

यदि आप एक ही फ़ंक्शन को उसी आर्ग के साथ कॉल करना चाहते हैं, तो उपयोग करें apply

उदाहरण:

var is_debug = true;
var debug = function() {
  if (is_debug) {
    console.log.apply(console, arguments);
  }
}

debug("message", "another argument")

4

गन्नार के समान उत्तर, अधिक पूर्ण उदाहरण के साथ: आप पूरी तरह से पारदर्शी रूप से पूरी चीज़ वापस कर सकते हैं:

function dumpArguments(...args) {
  for (var i = 0; i < args.length; i++)
    console.log(args[i]);
  return args;
}

dumpArguments("foo", "bar", true, 42, ["yes", "no"], { 'banana': true });

आउटपुट:

foo
bar
true
42
["yes","no"]
{"banana":true}

https://codepen.io/fnocke/pen/mmoxOr?editors=0010


3

हाँ यदि आपको यह पता नहीं है कि फ़ंक्शन डिक्लेरेशन के समय कितने तर्क संभव हैं तो आप फ़ंक्शन को बिना मापदंडों के घोषित कर सकते हैं और सभी वेरिएबल्स को तर्क सरणी द्वारा एक्सेस कर सकते हैं जो फ़ंक्शन कॉलिंग के समय पास किए जाते हैं।


2

ES6 में आप कुछ इस तरह से कर सकते हैं:

function foo(...args) 
{
   let [a,b,...c] = args;

   console.log(a,b,c);
}


foo(1, null,"x",true, undefined);


1
तुम भी `` समारोह फू (ए, बी, ... सी) {कंसोल.लॉग (ए, बी, सी) कर सकते हैं; } `` `
टिटुआ

-11

ES6 में, उपयोग करें Array.from:

function foo()
  {
  foo.bar = Array.from(arguments);
  foo.baz = foo.bar.join();
  }

foo(1,2,3,4,5,6,7);
foo.bar // Array [1, 2, 3, 4, 5, 6, 7]
foo.baz // "1,2,3,4,5,6,7"

गैर- ES6 कोड के लिए, JSON.stringify और JSON.parse का उपयोग करें:

function foo()
  {
  foo.bar = JSON.stringify(arguments); 
  foo.baz = JSON.parse(foo.bar); 
  }

/* Atomic Data */
foo(1,2,3,4,5,6,7);
foo.bar // "{"0":1,"1":2,"2":3,"3":4,"4":5,"5":6,"6":7}"
foo.baz // [object Object]

/* Structured Data */
foo({1:2},[3,4],/5,6/,Date())
foo.bar //"{"0":{"1":2},"1":[3,4],"2":{},"3":"Tue Dec 17 2013 16:25:44 GMT-0800 (Pacific Standard Time)"}"
foo.baz // [object Object]

यदि परिरक्षण के बजाय संरक्षण की आवश्यकता है, तो आंतरिक संरचित क्लोनिंग एल्गोरिथ्म का उपयोग करें

यदि DOM नोड्स पास हैं, तो XMLSerializer का उपयोग किसी असंबंधित प्रश्न के रूप में करें ।

with (new XMLSerializer()) {serializeToString(document.documentElement) }

यदि बुकमार्कलेट के रूप में चल रहा है, तो आपको त्रुटि संरचना में प्रत्येक संरचित डेटा तर्क को लपेटने की आवश्यकता हो सकती है JSON.stringify ठीक से काम करने के है।

संदर्भ


3
पहला: यह जो कुछ भी वस्तुओं में पारित किया जाता है वह क्लोन करेगा। दूसरा: सब कुछ JSON के लिए कठोर नहीं किया जा सकता है। अर्थात्: फ़ंक्शंस, डोम ऑब्जेक्ट्स, ने कहा कि तार स्ट्रिंग के रूप में कड़े होते हैं ...
जॉन डेवोरक

@JanDvorak क्या आप डोम ऑब्जेक्ट्स, फ़ंक्शंस और दिनांक को हैंडल करने वाले फ़ंक्शन के साथ मेरे उत्तर को संपादित कर सकते हैं?
पॉल स्वेट

1
+1, त्रुटि रिपोर्टिंग के लिए तर्कों को स्ट्रिंग के रूप में पारित करने की कोशिश करते हुए, वस्तु एक स्ट्रिंग '[ऑब्जेक्ट तर्क]] के रूप में समाप्त होती है और कंसोल में मानों को प्रदर्शित नहीं करने के लिए लॉगिंग करती है। हालांकि यह ओपी को जवाब देने के लिए प्रतीत नहीं होता है, यह मेरे सवाल का जवाब देता है, धन्यवाद!
जॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.