জাভাস্ক্রিপ্ট ফাংশনে অজানা সংখ্যক আর্গুমেন্ট পাস করুন


86

অজানা সংখ্যক তর্ক যুক্ত করার উপায় আছে কি:

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

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

এছাড়াও, আমি কীভাবে যুক্তির সংখ্যা পাস করব?



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

উত্তর:


147

ES3 (বা ES5 বা পুরাতন স্কুল জাভাস্ক্রিপ্ট)

ম্যাজিক argumentsঅবজেক্টের মাধ্যমে যে কোনও জাভাস্ক্রিপ্ট ফাংশনে পাস হওয়া যুক্তিগুলি আপনি অ্যাক্সেস করতে পারেন , যা অ্যারের অনুরূপ আচরণ করে। argumentsআপনার ফাংশনটি ব্যবহার করার মতো লাগবে

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

এটা যে নোট গুরুত্বপূর্ণ argumentsহয় না একটি অ্যারের। এমডিসির এটিতে কিছু ভাল ডকুমেন্টেশন রয়েছে: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Funtions#USS_The_arguments_object

আপনি চালু করতে চান, argumentsএকটি অ্যারের রূপান্তরিত করে যার ফলে আপনার মত জিনিস করতে পারেন .slice(), .push()ইত্যাদি ভালো কিছু ব্যবহার:

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

ES6 / টাইপস্ক্রিপ্ট

আরও ভাল উপায় আছে! নতুন বিশ্রামের প্যারামিটারগুলির বৈশিষ্ট্যটি আপনার পিছনে রয়েছে:

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

4
যেমন একটি বিশদ এবং একই সময়ে সংক্ষিপ্ত + সহজ উত্তর :) জন্য ধন্যবাদ
Mese

4
এখানে 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');

বিশ্রাম পরামিতি এবং আর্গুমেন্ট অবজেক্টের মধ্যে তিনটি প্রধান পার্থক্য রয়েছে:

  • বাকী প্যারামিটারগুলিতে কেবল একটি আলাদা নাম দেওয়া হয়নি, যখন আর্গুমেন্ট অবজেক্টে ফাংশনে সমস্ত আর্গুমেন্ট থাকে;
  • আর্গুমেন্ট অবজেক্টটি সত্যিকারের অ্যারে নয়, যখন বাকী পরামিতিগুলি অ্যারে উদাহরণস্বরূপ, যার অর্থ সাজানো, মানচিত্র, ফর বাচ বা পপের মতো পদ্ধতিগুলি সরাসরি এতে প্রয়োগ করা যেতে পারে;
  • আর্গুমেন্ট অবজেক্টের নিজস্ব নির্দিষ্ট ক্রিয়াকলাপ রয়েছে (কলি সম্পত্তি হিসাবে)।

এটি ওয়েব বিকাশের জন্য নিখুঁত ধারণা তৈরি করে যা সাধারণত পিএইচপি সিন্ট্যাক্স ব্যবহার করে।
দাদান



6

একটা গোপন নামক জাভাস্ক্রিপ্ট প্রতিটি ফাংশন প্রেরণ অবজেক্ট arguments

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

আর্গুমেন্টগুলির মাধ্যমে পুনরাবৃত্তি করতে, আপনি একটি লুপ ব্যবহার করবেন:

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

মনে রাখবেন যে argumentsএটি সত্যিকারের অ্যারে নয়, সুতরাং আপনার যদি অ্যারে হিসাবে এটির প্রয়োজন হয় তবে আপনি এটিকে রূপান্তরিত করতে পারেন:

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

4
শুধু মনে রাখবেন যে একটি "বাস্তব" অ্যারে নয়, এটা একটি "অ্যারে-মত" বস্তু (কিছু বিশেষ বৈশিষ্ট্য সঙ্গে), কিন্তু এটা এ "এরে পদ্ধতি" ব্যবহার করতে, আপনি রূপান্তর করতে এটা যেমন প্রয়োজন হবে 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)

@ মিডার, আমি এর মতো বেনামে ফাংশন ব্যবহার করতে পছন্দ করি। চমৎকার উদাহরণ! এছাড়াও, আপনি কি সেখানে বেশ কয়েকটি সেমিকোলন মিস করছেন?
জ্যাকব রিলকিন

@ মিডার, জাভাস্ক্রিপ্ট # সেফ এ সেমিকোলন সন্নিবেশ
জ্যাকব রিলকিন

@ মিডার, প্রকৃতপক্ষে, forব্লকের পরে কেবলমাত্র সেমিকোলনটির প্রয়োজন নেই, তবে আমি শেষ লাইনের শেষে একটি যুক্ত করব।
খ্রিস্টান সি সালভাদে

কেন আপনাকে () এর মধ্যে ফাংশনটি রাখতে হবে?
আজসি

4
@ ওয়েং, এটি প্রায় 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

ES6 এ বিশ্রামের পরামিতি

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);

ব্যাবেলজেএস ব্যবহার করে আমি ফাংশনটিকে ওল্ডস্কুল জেএসে রূপান্তর করেছি:

"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

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

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');
    }
}

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