ফাংশনের সমস্ত যুক্তি কি সেই ফাংশনের অভ্যন্তরে একক বস্তু হিসাবে পাওয়া সম্ভব?


উত্তর:


346

ব্যবহার arguments। আপনি এটি অ্যারের মতো অ্যাক্সেস করতে পারেন। arguments.lengthযুক্তি সংখ্যার জন্য ব্যবহার করুন ।


46
এটি কেবল functionSতিহ্যবাহী জাভাস্ক্রিপ্টের জন্য কাজ করে , 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/ জাভা স্ক্রিপ্ট / রেফারেন্স / ফাংশন_ এবং_ফ্যানশন_স্কোপ / বিভাগসমূহ


3
এখানেও ফলাফল পোস্ট করবেন না কেন? :)
জোনাথন আজুলায়

2
এটি গৃহীত উত্তরের চেয়ে অনেক ভাল কারণ এটিতে একটি ওয়ার্কিং কোড স্নিপেট রয়েছে এবং আউটপুট দেখায়। গৃহীত উত্তরটি খুব বিরল।
ম্যাক 12

উত্তম উত্তর ... "সত্যিকারের অ্যারে নয়"
-কে

আমি একটি সাধারণ বর্ণনায় একটি লিঙ্ক যুক্ত করেছি: "অ্যারের মতো অবজেক্ট" কেবল একটি "অবজেক্ট যা একটি অ-নেতিবাচক পূর্ণসংখ্যার দৈর্ঘ্যের সম্পত্তি এবং সাধারণত কিছু সূচকযুক্ত বৈশিষ্ট্য।" মজিলা লিঙ্ক থেকে: "এটি অ্যারের সাথে সমান, তবে দৈর্ঘ্য ব্যতীত আরে বৈশিষ্ট্যগুলি নেই" "
লুক

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"]
ডেভিড বাউকুম

1
@ ডেভিডবাউকাম এটি সঠিক is কারণ তীর ফাংশন একটি নতুন সুযোগ তৈরি করে না, এবং "আর্গুমেন্ট" সুযোগ থেকে সংগ্রহ করা হয়। তবে সবচেয়ে খারাপ পরিস্থিতি রেফারেন্স এরির নয়। এটি "আর্গুমেন্টস" একটি বাহ্যিক ক্ষেত্র থেকে সংগ্রহ করা হয়। তারপরে আপনি কোনও ব্যতিক্রম পাবেন না এবং আপনার অ্যাপ্লিকেশনটিতে অদ্ভুত বাগগুলি পাওয়া যাবে।
pgsandstrom

1
এটিকে "রেস্ট প্যারামিটার "ও বলা হয়, দেখুন ডেভেলপার.মোজিলা.আর.ইন.ইউএস / ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স /…
ডেনিস

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

মজিলা এমডিএন থেকে :

আপনার যুক্তিগুলিতে টুকরো টুকরো করা উচিত নয় কারণ এটি জাভাস্ক্রিপ্ট ইঞ্জিনগুলিতে অপ্টিমাইজেশন প্রতিরোধ করে (উদাহরণস্বরূপ V8)।


2
আপডেটের জন্য ধন্যবাদ. বিকল্প হিসাবে JSON.stringify এবং JSON.pars ব্যবহার করুন: স্ট্রিংফিকেশন function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); } পরিবর্তে সংরক্ষণের প্রয়োজন হলে অভ্যন্তরীণ কাঠামোগত ক্লোনিং অ্যালগরিদম ব্যবহার করুন । যদি ডিওএম নোডগুলি পাস হয়ে যায় তবে কোনও সম্পর্কযুক্ত প্রশ্নের মতো এক্সএমএলসিরাইজার ব্যবহার করুন । 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
এমনকি আপনি `` `ফাংশন foo (a, b, ... c) so কনসোল.লগ (ক, খ, সি) করতে পারেন; } `` `
টাইটুয়ানটি

-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"

নন-ইএস code কোডের জন্য, 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]

স্ট্রিংফিকেশনের পরিবর্তে যদি সংরক্ষণের প্রয়োজন হয় তবে অভ্যন্তরীণ কাঠামোগত ক্লোনিং অ্যালগরিদম ব্যবহার করুন

যদি ডিওএম নোডগুলি পাস হয়ে যায় তবে কোনও সম্পর্কযুক্ত প্রশ্নের মতো এক্সএমএলসিরাইজার ব্যবহার করুন ।

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

বুকমার্কলেট হিসাবে চলতে থাকলে, JSON.stringifyসঠিকভাবে কাজ করার জন্য আপনাকে প্রতিটি কাঠামোগত ডেটা যুক্তিটি একটি ত্রুটিযুক্ত কনস্ট্রাক্টরে মোড়ানো দরকার হতে পারে ।

তথ্যসূত্র


3
প্রথম: এটি যে কোনও বস্তুগুলিতে পাস হবে তা ক্লোন করবে Second দ্বিতীয়: জেএসএনে সবকিছুই স্ট্রিংফাই করা যায় না। যথা: ফাংশন, ডিওএম অবজেক্টস বলেছে তারিখগুলি স্ট্রিং হিসাবে স্ট্রিং হয় ...
জন ডিভোরাক

@ জনডভোরাক আপনি কি আমার উত্তরটি এমন কোনও ফাংশন দিয়ে সম্পাদনা করতে পারেন যা ডিওএম অবজেক্টস, ফাংশন এবং তারিখগুলি পরিচালনা করে?
পল সুইট

1
+1, স্ট্রিং হিসাবে ত্রুটি প্রতিবেদন করার জন্য আর্গুমেন্টগুলি পাস করার চেষ্টা করার পরে অবজেক্টটি স্ট্রিং '[অবজেক্ট আর্গুমেন্টস'] হিসাবে শেষ হয় এবং কনসোলে লগইন করা মানগুলি প্রদর্শন করে না। যদিও এটি ওপির উত্তর বলে মনে হচ্ছে না এটি আমার প্রশ্নের উত্তর দেয়, ধন্যবাদ!
জন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.