जावास्क्रिप्ट फ़ंक्शन में अज्ञात संख्या में तर्क पास करें


84

क्या एक अज्ञात संख्या में तर्क पारित करने का एक तरीका है:

var print_names = function(names) {
    foreach(name in names) console.log(name); // something like this
}

print_names('foo', 'bar', 'baz');

इसके अलावा, मुझे किस तरह की दलीलें मिलेंगी?



अब तक सार्वजनिक ओवरराइड का उत्तर केवल एक ही है जो बताता है कि अज्ञात संख्या के तर्कों (फ़ंक्शन कॉल में) (उपयोग करके ) को कैसे पास किया जाए.apply । अन्य लोग दिखाते हैं कि अज्ञात संख्या के तर्कों को (फ़ंक्शन के भीतर से) (उपयोग करके ) कैसे पढ़ा जाएarguments ।
— बेन जे १

जवाबों:


146

ES3 (या ES5 या सुनार जावास्क्रिप्ट)

आप किसी भी जावास्क्रिप्ट फ़ंक्शन को दिए गए तर्कों को जादू की argumentsवस्तु के माध्यम से एक्सेस कर सकते हैं , जो एक सरणी के समान व्यवहार करता है। argumentsअपने फ़ंक्शन का उपयोग करना पसंद करेंगे

var print_names = function() {
     for (var i=0; i<arguments.length; i++) console.log(arguments[i]);
}

ऐसा नहीं है कि नोट के लिए महत्वपूर्ण है argumentsहै नहीं एक सरणी। MDC के पास कुछ अच्छे दस्तावेज हैं: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#Using_the_arguments_object

आप चालू करना चाहते हैं argumentsएक सरणी में इतना है कि आप की तरह कर सकते हैं .slice(), .push()आदि, कुछ इस तरह उपयोग करें:

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

ईएस 6 / टाइपस्क्रिप्ट

एक बेहतर तरीका है! नए बाकी पैरामीटर फ़ीचर में आपकी पीठ है:

var print_names = function(...names) {
    for (let i=0; i<names.length; i++) console.log(names[i]);
}

3
इस तरह के एक विस्तृत और एक ही समय में लघु + सरल जवाब के लिए धन्यवाद :)
— Mese

1
ES6 का संदर्भ spread syntaxयहां काफी गलत है। यह एक rest parameterउदाहरण है जो आपने दिया था। अच्छा जवाब है, लेकिन यह भ्रमित करते हुए कि इसे संदर्भित किया जाता हैspread
— द्रेनाई

आपके उत्तर के लिए धन्यवाद! मैंने इसे एक उपयोगी लेख के रूप में समझाते हुए पाया कि इसके साथ क्या हो रहा है Array.prototype.slice.call(arguments): medium.com/@andrewsburke/…
— AnnieP

22

ES6 / ES2015

बाकी पैरामीटर सिंटैक्स का लाभ उठाएं ।

function printNames(...names) {
  console.log(`number of arguments: ${names.length}`);
  for (var name of names) {
    console.log(name);
  }
}

printNames('foo', 'bar', 'baz');

बाकी मापदंडों और तर्क ऑब्जेक्ट के बीच तीन मुख्य अंतर हैं:

  • बाकी पैरामीटर केवल वे हैं जिन्हें एक अलग नाम नहीं दिया गया है, जबकि तर्क ऑब्जेक्ट में फ़ंक्शन में पारित सभी तर्क हैं;
  • तर्क वस्तु एक वास्तविक सरणी नहीं है, जबकि बाकी पैरामीटर ऐरे इंस्टेंस हैं, जिसका अर्थ है जैसे कि सॉर्ट, मैप, फॉरएच या पॉप सीधे उस पर लागू किया जा सकता है;
  • तर्कों का ऑब्जेक्ट अतिरिक्त कार्यक्षमता के लिए विशिष्ट है (जैसे कैलली संपत्ति)।

यह वेब विकास के लिए एकदम सही समझ में आता है जो आम तौर पर सामान्य PHP सिंटैक्स का उपयोग करता है।
— दादन



6

जावास्क्रिप्ट में प्रत्येक फ़ंक्शन के लिए एक छिपी हुई वस्तु पारित की जाती है arguments।

आप arguments.lengthफ़ंक्शन में पारित तर्कों की मात्रा प्राप्त करने के लिए उपयोग करेंगे ।

तर्कों के माध्यम से पुनरावृत्ति करने के लिए, आप एक लूप का उपयोग करेंगे:

for(var i = arguments.length; i--) {
   var arg = arguments[i];
}

ध्यान दें कि argumentsएक वास्तविक सरणी नहीं है, इसलिए यदि आपको एक सरणी के रूप में इसकी आवश्यकता है तो आप इसे इस तरह परिवर्तित करेंगे:

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

3
बस ध्यान दें कि यह एक 'असली' सरणी नहीं है, यह एक "सरणी की तरह" वस्तु (कुछ विशेष विशेषताओं के साथ) है, लेकिन उस पर "सरणी तरीकों" का उपयोग करने के लिए, आप कन्वर्ट करने के लिए यह, उदाहरण के लिए की आवश्यकता होगी var args = Array.prototype.slice.call(arguments);, var args = Array.apply(null, arguments);, आदि , कई तरीके हैं ...
— क्रिश्चियन सी। साल्वाडोर

4

arguments.length। आप उस पर एक लूप के लिए उपयोग कर सकते हैं।

(function () {
    for (var a = [], i = arguments.length; i--;) {
        a.push(arguments[i]);
    };
    return a;
})(1, 2, 3, 4, 5, 6, 7, 8)

@meder, मुझे अनाम कार्यों का उपयोग करना बहुत पसंद है। अच्छा उदाहरण! इसके अलावा, क्या आप वहाँ अर्धविराम के एक जोड़े को याद कर रहे हैं?
— जैकब रिलकिन

लगता है जैसे ठीक चल रहा है।
— पदक विजेता

@meder, जावास्क्रिप्ट में अर्द्धविराम प्रविष्टि #ftf
— याकूब Relkin

@ रेडर, वास्तव में, forब्लॉक के बाद सिर्फ अर्धविराम की वास्तव में जरूरत नहीं है, हालांकि मैं अंतिम पंक्ति के अंत में एक जोड़ूंगा ।
— क्रिश्चियन सी। साल्वादो

1
@weng, यह FunctionExpressionबनाम के बारे में है FunctionDeclaration, इस लेख की जाँच करें ।
— क्रिश्चियन सी। साल्वादो

2

ES6 के लिए अब बहुत बेहतर है

function Example() {
    return {
        arguments: (...args) =>{
            args.map(a => console.log());
        }
    }
}

var exmpl = new Example();
exmpl.arguments(1, 2, 3, 'a', 'b', 'c');

आशा है कि ये आपकी मदद करेगा


0

ईएस 6 में बाकी पैरामीटर

const example = (...args) => {
  for (arg in args) {
    console.log(arg);
  }
}

नोट: आप बाकी पैरामेट्स से पहले नियमित पैरामीटर पास कर सकते हैं

const example = (arg1, ...args) => {
  console.log(arg1);
  for (arg in args) {
    console.log(arg);
  }
}

0

आप अपने मापदंडों को किसी सरणी में इकट्ठा करने के लिए स्प्रेड / रेस्ट ऑपरेटर का उपयोग कर सकते हैं और फिर lengthसरणी आपके द्वारा पास किए गए मापदंडों की संख्या होगी:

function foo(...names) {
    console.log(names);
    return names;
}

console.log(foo(1, 2, 3, 4).length);

BabelJS का उपयोग करके मैंने फ़ंक्शन को oldschool JS में परिवर्तित कर दिया है:

"use strict";

function foo() {
  for (var _len = arguments.length, names = new Array(_len), _key = 0; _key < _len; _key++) {
    names[_key] = arguments[_key];
  }

  console.log(names);
  return names;
}

0

आप स्प्रेड / रेस्ट ऑपरेटर का उपयोग करके एक फंक्शन बना सकते हैं और वहीं से आपने अपने लक्ष्य को प्राप्त किया। कृपया नीचे दिए गए chunk पर एक नज़र डालें।

const print_names = (...args) => args.forEach(x => console.log(x));


-4

मुझे यह करना पसंद है:

यदि आप तर्कों की संख्या नहीं जानते हैं तो यह मदद नहीं करेगा, लेकिन अगर आप उनमें से आदेश को याद नहीं रखना चाहते हैं तो यह मदद करता है।

/**
 *  @param  params.one        A test parameter
 *  @param  params.two        Another one  
 **/
function test(params) {

    var one = params.one;
    if(typeof(one) == 'undefined') {
        throw new Error('params.one is undefined');
    }

    var two = params.two;
    if(typeof(two) == 'undefined') {
        throw new Error('params.two is undefined');
    }
}

1
सवाल अज्ञात तर्कों के बारे में था।
— एड्रियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.