জাভাস্ক্রিপ্ট চলমান আর্গুমেন্ট সংখ্যা


531

জাভাস্ক্রিপ্টে কোনও ফাংশনের জন্য "সীমাহীন" ভারগুলি অনুমতি দেওয়ার কোনও উপায় আছে কি?

উদাহরণ:

load(var1, var2, var3, var4, var5, etc...)
load(var1)



1
@ লুক না, তাই না। এই প্রশ্নটি জিজ্ঞাসা করে যে কোনও অ্যারেতে আর্গুমেন্টগুলির সাথে একটি স্বেচ্ছাসেবী সংখ্যার সাথে একটি ফাংশনটি কীভাবে কল করা যায়। এটি এমন কলটি কীভাবে পরিচালনা করবেন তা জিজ্ঞাসা করে।
স্কুফি

1
আরও সহজ অনুসন্ধানের জন্য, এই জাতীয় ফাংশনটিকে 'ভের্যাডিক ফাংশন' বলা হয়।
gschenk

উত্তর:


814

অবশ্যই, argumentsঅবজেক্টটি ব্যবহার করুন ।

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

1
Tnx। অ্যান্ড্রয়েড নেটিভ কোড থেকে জাভাস্ক্রিপ্টে কোনও ওয়েবভিউতে স্ট্রিংগুলি পার্স করার জন্য এটি দুর্দান্ত।
জোহান হিক্সমা

4
এই সমাধানটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে। ধন্যবাদ। আর্গুমেন্ট কীওয়ার্ড এখানে আরও তথ্য ।
ব্যবহারকারী 2

26
argumentsএকটি বিশেষ "অ্যারে-জাতীয়" অবজেক্ট, যার অর্থ এটির দৈর্ঘ্য রয়েছে তবে অন্য কোনও অ্যারে ফাংশন নেই। আরও তথ্যের জন্য বিকাশকারী.মোজিলা.আর.ইন- ইউএস
লূক

4
মজার বিষয় হচ্ছে জাভাস্ক্রিপ্টে অ্যারে পদ্ধতিগুলি এমনভাবে সংজ্ঞায়িত করা হয়েছে যে তারা কোনও lengthসম্পত্তি থাকা কোনও বস্তুর উপরে কাজ করে । এর মধ্যে argumentsঅবজেক্টটি অন্তর্ভুক্ত রয়েছে । আমরা আরো জানি, এবং যে পদ্ধতি concatফেরৎ একটি কপি 'অ্যারে' এটা বলা হচ্ছে, আমরা সহজে রূপান্তর করতে পারেন argumentsএই মত একটি বাস্তব অ্যারেতে বস্তু: var args = [].concat.call(arguments)। কিছু লোক Array.prototype.concat.callপরিবর্তে ব্যবহার করতে পছন্দ করে তবে আমি পছন্দ করি []তারা সংক্ষিপ্ত এবং মিষ্টি!
স্টিজন ডি উইট

2
@ ইয়াসিরজান ব্যবহার করুন[...arguments].join()
উইলিয়ান ডি

178

(বেশিরভাগ) সাম্প্রতিক ব্রাউজারগুলিতে আপনি এই সিনট্যাক্সের সাহায্যে চলক সংখ্যক আর্গুমেন্ট গ্রহণ করতে পারেন:

function my_log(...args) {
     // args is an Array
     console.log(args);
     // You can pass this array as parameters to another function
     console.log(...args);
}

এখানে একটি ছোট উদাহরণ:

function foo(x, ...args) {
  console.log(x, args, ...args, arguments);
}

foo('a', 'b', 'c', z='d')

=>

a
Array(3) [ "b", "c", "d" ]
b c d
Arguments
    0: "a"
    1: "b"
    2: "c"
    3: "d"
    length: 4

ডকুমেন্টেশন এবং আরও উদাহরণ এখানে: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / ফাংশন / রেস্ট_প্রেমিটার


27
এফওয়াইআই এটিকে "বাকী প্যারামিটার সিনট্যাক্স" বলা হয়: developer.mozilla.org/en-US/docs/Web/JavaScript/References/…
tanguy_k

4
+1 এটি মার্জিত এবং পরিষ্কার সমাধান। প্যারামিটারগুলির দীর্ঘ তালিকাগুলি অন্য ফাংশন কলটিতে যাওয়ার জন্য বিশেষভাবে উপযুক্ত, এবং সম্ভাব্য যে এই পরিবর্তনশীল পরামিতিগুলি স্বেচ্ছাসেবী অবস্থানে রয়েছে।
হ্যাক্স্পোর


2
ব্রাউজার সমর্থন দেখাচ্ছে এমন একটি সারণী এখানে রয়েছে - caniuse.com/#feat=rest-paraters
ব্রায়ান বার্নস

1
এমন সুন্দর উত্তর!
আশীষ

113

আরেকটি বিকল্প হ'ল প্রসঙ্গ অবজেক্টে আপনার যুক্তিগুলি পাস করা।

function load(context)
{
    // do whatever with context.name, context.address, etc
}

এবং এটি এটি ব্যবহার করুন

load({name:'Ken',address:'secret',unused:true})

এটির সুবিধা রয়েছে যে আপনি যতগুলি নামী আর্গুমেন্ট আপনারা চান যুক্ত করতে পারেন এবং ফাংশনটি উপযুক্ত হিসাবে এটি ব্যবহার করতে পারে (বা না)।


4
এটি আরও ভাল হবে যেহেতু এটি যুক্তির আদেশের সংযোগটি সরিয়ে দেয়। আলগাভাবে মিলিত ইন্টারফেসগুলি ভাল স্ট্যান্ডার্ড অনুশীলন ...
জোনাস শুবার্ট এরল্যান্ডসন

9
অবশ্যই, এটি কিছু ক্ষেত্রে ভাল। তবে আসুন আমরা বলতে পারি যে পৃথক যুক্তিগুলি সত্যই একে অপরের সাথে সম্পর্কিত নয় বা সমস্তের সমান অর্থ (অ্যারের উপাদানগুলির মতো) বলে মনে করা হয়। তারপরে ওপির উপায় সবচেয়ে ভাল।
rvighne

1
এটিও দুর্দান্ত কারণ আপনি যদি চান তবে আপনি contextকোডটি দিয়ে যুক্তিটি তৈরি করতে এবং এটি ব্যবহারের আগে এটি পাস করতে পারেন ।
নাট সি কে

46

আমি কেনের উত্তরকে সবচেয়ে গতিশীল বলে একমত এবং আমি এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে চাই। যদি এটি এমন কোনও ফাংশন যা আপনি বিভিন্ন যুক্তি দিয়ে একাধিকবার কল করেন - আমি কেনের নকশা ব্যবহার করি তবে তারপরে ডিফল্ট মানগুলি যুক্ত করে:

function load(context) {

    var defaults = {
        parameter1: defaultValue1,
        parameter2: defaultValue2,
        ...
    };

    var context = extend(defaults, context);

    // do stuff
}

এইভাবে, যদি আপনার অনেকগুলি পরামিতি থাকে তবে অগত্যা ফাংশনে প্রতিটি কল দিয়ে সেগুলি সেট করার দরকার নেই, আপনি কেবল অ-ডিফল্ট নির্দিষ্ট করতে পারেন। প্রসারিত পদ্ধতির জন্য, আপনি jQuery এর প্রসারিত পদ্ধতি ( $.extend()) ব্যবহার করতে পারেন , নিজের নিজস্ব কারুকাজ করতে পারেন বা নিম্নলিখিত ব্যবহার করতে পারেন:

function extend() {
    for (var i = 1; i < arguments.length; i++)
        for (var key in arguments[i])
            if (arguments[i].hasOwnProperty(key))
                arguments[0][key] = arguments[i][key];
    return arguments[0];
}

এটি কনফেক্সট অবজেক্টটিকে ডিফল্টের সাথে একীভূত করবে এবং আপনার অবজেক্টের কোনও অপরিবর্তিত মান ডিফল্টর সাথে পূরণ করবে।


3
+1 টি। দুর্দান্ত কৌশল। প্রতিটি প্যারামিটার সংজ্ঞায়িত, ডিফল্ট বা অন্যথায় প্রচুর বয়লার প্লেট সংরক্ষণ করে।
নীল

1
_.defaults()নির্দিষ্ট এবং ডিফল্ট আর্গুমেন্টগুলিকে মার্জ করার জন্য ইন্ডসকোরের পদ্ধতিটি একটি দুর্দান্ত বিকল্প।
mbeasley

18

হ্যাঁ, ঠিক এর মতো:

function load()
{
  var var0 = arguments[0];
  var var1 = arguments[1];
}

load(1,2);

18

রামাস্ট নির্দেশিত হিসাবে বিশ্রামের প্যারামিটার সিনট্যাক্স ব্যবহার করা ভাল।

function (a, b, ...args) {}

আমি ঠিক ... যুক্তি যুক্তির কিছু দুর্দান্ত সম্পত্তি যুক্ত করতে চাই

  1. এটি একটি অ্যারে, এবং আর্গুমেন্টের মতো কোনও বস্তু নয়। এটি আপনাকে মানচিত্রের মতো ফাংশন প্রয়োগ করতে বা সরাসরি বাছাই করতে সহায়তা করে।
  2. এটিতে সমস্ত পরামিতি অন্তর্ভুক্ত নয় তবে কেবল এটির মধ্য দিয়ে পাস হয়েছে। উদাহরণস্বরূপ ফাংশন (ক, খ, ... আরগস) এ ক্ষেত্রে আর্গুমেন্টে তিনটি যুক্তি রয়েছে le দৈর্ঘ্য

15

ইতিমধ্যে উল্লিখিত হিসাবে, আপনি এটি ব্যবহার করতে পারেন arguments ফাংশন প্যারামিটারগুলির একটি পরিবর্তনশীল সংখ্যক পুনরুদ্ধার অবজেক্টটি ।

আপনি যদি একই যুক্তি দিয়ে অন্য ফাংশনটিতে কল করতে চান তবে ব্যবহার করুন apply। এমনকি আপনি argumentsঅ্যারেতে রূপান্তর করে যুক্তি যুক্ত বা সরাতে পারেন । উদাহরণস্বরূপ, এই ফাংশনটি কনসোলটিতে লগ ইন করার আগে কিছু পাঠ্য সন্নিবেশ করায়:

log() {
    let args = Array.prototype.slice.call(arguments);
    args = ['MyObjectName', this.id_].concat(args);
    console.log.apply(console, args);
}

আর্গুমেন্টগুলিকে অ্যারেতে রূপান্তর করার জন্য দুর্দান্ত সমাধান। এটি আজ আমার জন্য সহায়ক ছিল।
Dmytro মেডভিড

8

যদিও আমি সাধারণত স্বীকার করি যে নামযুক্ত আর্গুমেন্ট পদ্ধতির ব্যবহার কার্যকর এবং নমনীয় (যদি না আপনি অর্ডারটির বিষয়ে চিন্তা করেন তবে এই ক্ষেত্রে আর্গুমেন্ট সহজতর) তবে আমার এমবিএসলে পদ্ধতির ব্যয় (ডিফল্ট এবং প্রসারিত ব্যবহার) সম্পর্কে উদ্বেগ রয়েছে। এটি ডিফল্ট মানগুলি টানতে ব্যয় করার একটি চূড়ান্ত পরিমাণ। প্রথমত, ডিফল্টগুলি ফাংশনের অভ্যন্তরে সংজ্ঞায়িত করা হয়, সুতরাং সেগুলি প্রতিটি কলে পুনরায় সঞ্চিত হয়। দ্বিতীয়ত, আপনি সহজেই নামকৃত মানগুলি পড়তে পারেন এবং একই সাথে || ব্যবহার করে ডিফল্ট সেট করতে পারেন। এই তথ্যটি পেতে আরও একটি নতুন অবজেক্ট তৈরি এবং মার্জ করার দরকার নেই।

function load(context) {
   var parameter1 = context.parameter1 || defaultValue1,
       parameter2 = context.parameter2 || defaultValue2;

   // do stuff
}

এটি প্রায় একই পরিমাণের কোড (সম্ভবত কিছুটা বেশি) তবে রানটাইম ব্যয়ের একটি ভগ্নাংশ হওয়া উচিত।


সম্মত হন, যদিও ক্ষতিটি নিজেই মান বা ডিফল্টর ধরণের উপর নির্ভর করে। অন্যথায়, (parameter1=context.parameter1)===undefined && (parameter1=defaultValue1)বা কম কোড ভলিউমের জন্য একটি ছোট সহায়ক সহায়ক ফাংশন: function def(providedValue, default) {return providedValue !== undefined ? providedValue : defaultValue;} var parameter1 = def(context.parameter1, defaultValue1)বিকল্প নিদর্শন সরবরাহ করুন। তবে, আমার বক্তব্যটি এখনও দাঁড়িয়েছে: প্রতিটি ফাংশন অনুরোধের জন্য অতিরিক্ত অবজেক্ট তৈরি করা এবং বেশ কয়েকটি ডিফল্ট মান নির্ধারণের জন্য ব্যয়বহুল লুপগুলি চালানো ওভারহেডের পাগল।
ম্যাকুরল্যান্ড

7

@ আরফাম্যাটিকরা আর্গুমেন্ট কীওয়ার্ডটি ব্যবহার করে দেখিয়েছিলেন এবং @ কেন ব্যবহারের জন্য কোনও অবজেক্টের দুর্দান্ত উদাহরণ দেখিয়েছে বলে আমি মনে করি না যে এই পরিস্থিতিতে যা ঘটছে তা সত্যই আমি সম্বোধন করেছি এবং ভবিষ্যতের পাঠককে বিভ্রান্ত করতে পারি বা কোনও খারাপ অভ্যাস প্ররোচিত করতে পারি যাতে কোনও ফাংশন স্পষ্টভাবে উল্লেখ করা হয় না / পদ্ধতিটি আর্গুমেন্ট / পরামিতিগুলির একটি পরিবর্তনশীল পরিমাণ গ্রহণ করার উদ্দেশ্যে।

function varyArg () {
    return arguments[0] + arguments[1];
}

যখন অন্য কোনও বিকাশকারী আপনার কোডটি সন্ধান করছেন তখন অনুমান করা খুব সহজ যে এই ফাংশনটি প্যারামিটার নেয় না। বিশেষত যদি সেই বিকাশকারী যুক্তিগুলিতে গোপন না হয় কীওয়ার্ডটি । এ কারণে স্টাইলের গাইডলাইনটি অনুসরণ করা এবং ধারাবাহিক হওয়া ভাল ধারণা। আমি সমস্ত উদাহরণের জন্য গুগল ব্যবহার করব।

আসুন স্পষ্টভাবে একই ফাংশনটির ভেরিয়েবল প্যারামিটার রয়েছে:

function varyArg (var_args) {
    return arguments[0] + arguments[1];
}

অবজেক্ট প্যারামিটার VS var_args

এমন অনেক সময় থাকতে পারে যখন কোনও অ্যাটাকের প্রয়োজন হয় কারণ এটি কোনও ডেটা ম্যাপের একমাত্র অনুমোদিত এবং বিবেচিত সেরা অনুশীলন পদ্ধতি। সহযোগী অ্যারেগুলি হতাশ এবং নিরুৎসাহিত করা হয়।

সাইড নোট: আর্গুমেন্ট কীওয়ার্ডটি আসলে কী হিসাবে সংখ্যা ব্যবহার করে কোনও বস্তুকে ফিরিয়ে দেয়। প্রোটোটাইপাল উত্তরাধিকার হ'ল অবজেক্ট পরিবার। জেএসে সঠিক অ্যারে ব্যবহারের জন্য উত্তরের শেষটি দেখুন

এই ক্ষেত্রে আমরা স্পষ্টভাবে এটিও বলতে পারি। দ্রষ্টব্য: এই নামকরণ কনভেনশনটি গুগল সরবরাহ করে না তবে এটি একটি পরমের ধরণের স্পষ্ট ঘোষণার উদাহরণ। আপনি যদি আপনার কোডটিতে আরও কঠোর টাইপ করা প্যাটার্ন তৈরি করতে চান তবে এটি গুরুত্বপূর্ণ।

function varyArg (args_obj) {
    return args_obj.name+" "+args_obj.weight;
}
varyArg({name: "Brian", weight: 150});

কোনটি বেছে নেবে?

এটি আপনার ফাংশন এবং প্রোগ্রামের প্রয়োজনের উপর নির্ভর করে। উদাহরণস্বরূপ, আপনি কেবলমাত্র সমস্ত আর্গুমেন্ট পেরিয়ে একটি পুনরাবৃত্ত প্রক্রিয়াতে একটি মান বেস ফেরার জন্য সন্ধান করছেন তবে অবশ্যই অবশ্যই আর্গুমেন্ট কীওয়ার্ডের সাথে লেগে থাকুন। আপনার যদি আপনার যুক্তি এবং ডেটা ম্যাপিংয়ের সংজ্ঞা প্রয়োজন হয় তবে অবজেক্ট পদ্ধতিটি যাওয়ার উপায়। আসুন দুটি উদাহরণ দেখুন এবং তারপরে আমাদের কাজ শেষ!

যুক্তি ব্যবহার

function sumOfAll (var_args) {
    return arguments.reduce(function(a, b) {
        return a + b;
    }, 0);
}
sumOfAll(1,2,3); // returns 6

অবজেক্টের ব্যবহার

function myObjArgs(args_obj) {
    // MAKE SURE ARGUMENT IS AN OBJECT OR ELSE RETURN
    if (typeof args_obj !== "object") {
        return "Arguments passed must be in object form!";
    }

    return "Hello "+args_obj.name+" I see you're "+args_obj.age+" years old.";
}
myObjArgs({name: "Brian", age: 31}); // returns 'Hello Brian I see you're 31 years old

কোনও বস্তুর পরিবর্তে একটি অ্যারে অ্যাক্সেস করা হচ্ছে ("... আরগস" বাকী প্যারামিটার)

উত্তরের উপরে উল্লিখিত হিসাবে আর্গুমেন্ট কীওয়ার্ডটি আসলে কোনও বস্তু দেয়। এর কারণে আপনি যে কোনও পদ্ধতিতে অ্যারের জন্য ব্যবহার করতে চান তা কল করতে হবে। এর একটি উদাহরণ:

Array.prototype.map.call(arguments, function (val, idx, arr) {});

এটি এড়াতে বাকি প্যারামিটারটি ব্যবহার করুন:

function varyArgArr (...var_args) {
    return var_args.sort();
}
varyArgArr(5,1,3); // returns 1, 3, 5

5

argumentsসমস্ত আর্গুমেন্টে প্রবেশ করার জন্য ফাংশনের অভ্যন্তরে অবজেক্টটি ব্যবহার করুন ।


3

কেন সচেতন হিসাবে নামযুক্ত বৈশিষ্ট্যযুক্ত কোনও বস্তু পাস করা প্রতিটি কলটিতে অস্থায়ী বস্তু বরাদ্দকরণ এবং ছেড়ে দেওয়ার জন্য ব্যয় যুক্ত করে রাখুন aware মান বা রেফারেন্স দ্বারা সাধারণ আর্গুমেন্ট পাস করা সাধারণত সবচেয়ে দক্ষ হবে। অনেক অ্যাপ্লিকেশনগুলির জন্য যদিও পারফরম্যান্স সমালোচিত নয় তবে কিছুটির জন্য এটি হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.